#include using namespace std; int t, m, n; int e[100000], s[100000], d[100000]; vector v[2][100000], pending_updates[2][100000]; int bit[2][100000], dp[100000], ans[100000]; void init() { dp[0] = 0; memset(ans, -1, sizeof(ans)); memset(bit, 0, sizeof(bit)); for (int i = 0; i < 2; i++) { for (int j = 0; j <= m; j++) { v[i][j].clear(); pending_updates[i][j].clear(); } } } void update(int id, int u, int v) { for (int i = u; i <= m; i += i & -i) { bit[id][i] += v; } } int query(int id, int u) { int ret = 0; for (int i = u; i > 0; i -= i & -i) { ret += bit[id][i]; } return ret; } int main() { scanf("%d", &t); while (t--) { scanf("%d %d", &m, &n); init(); for (int i = 1; i <= n; i++) { char c[5]; scanf("%s", c); e[i] = (c[0] == 'E' || c[0] == 'C'); } for (int i = 1; i <= n; i++) { scanf("%d", &s[i]); } for (int i = 1; i <= n; i++) { scanf("%d", &d[i]); v[e[i]][s[i]].push_back(d[i]); } for (int i = 1; i <= m; i++) { dp[i] = dp[i-1]; for (int j = 0; j < 2; j++) { int si = v[j][i].size(); for (int k = 0; k < si; k++) { int next = v[j][i][k]; pending_updates[j][next].push_back(i); } } for (int j = 0; j < 2; j++) { sort(pending_updates[j][i].begin(), pending_updates[j][i].end()); int si = pending_updates[j][i].size(); for (int k = si - 1; k >= 0; k--) { int now = pending_updates[j][i][k]; update(j, now, 1); dp[i] = max(dp[i], dp[now] + query(j, i) - query(j, now - 1)); // printf("j: %d i: %d now: %d\n", j, i, now); // printf("dp: %d query(i): %d query(now-1) %d\n\n", dp[now], query(j, i), query(j, now - 1)); } } // printf("%d: %d\n", i, dp[i]); } // printf("DP:\n"); // for (int i = 1; i <= m; i++) { // printf("%d ", dp[i]); // } printf("\n\n"); for (int i = 1; i <= m; i++) { if (ans[dp[i]] == -1) { ans[dp[i]] = i; } } for (int i = n; i >= 1; i--) { if (ans[i] == -1) { ans[i] = ans[i+1]; } } for (int i = 1; i <= n; i++) { if (i > 1) printf(" "); printf("%d", ans[i]); } printf("\n"); } }