#define _CRT_SECURE_NO_WARNINGS #pragma comment(linker, "/STACK:250000000") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define y1 klfjvkldfngldf using namespace std; int t; int m, n; vector a[2][50000]; const int N = 1 << 16; int P[2][2 * N]; int Q[2][2 * N]; void push(int v, int * Q, int * P) { if (P[v]) { P[2 * v] += P[v]; P[2 * v + 1] += P[v]; Q[2 * v] += P[v]; Q[2 * v + 1] += P[v]; P[v] = 0; } } void update(int v, int * Q, int * P) { Q[v] = max(Q[2 * v], Q[2 * v + 1]); } void add(int * Q, int * P, int v, int tL, int tR, int L, int R, int x) { if (L >= R) return; if (tL == L && tR == R) { P[v] += x; Q[v] += x; return; } push(v, Q, P); int m = (tL + tR) / 2; add(Q, P, 2 * v, tL, m, L, min(m, R), x); add(Q, P, 2 * v + 1, m, tR, max(L, m), R, x); update(v, Q, P); } int get_max(int * Q, int * P, int v, int tL, int tR, int L, int R) { if (L >= R) return 0; if (tL == L && tR == R) return Q[v]; push(v, Q, P); int m = (tL + tR) / 2; int res = max( get_max(Q, P, 2 * v, tL, m, L, min(m, R)), get_max(Q, P, 2 * v + 1, m, tR, max(L, m), R) ); update(v, Q, P); return res; } void read() { cin >> m >> n; for (int i = 0; i < m; ++i) { a[0][i].clear(); a[1][i].clear(); } vector from(n), to(n); vector t(n); for (int i = 0; i < n; ++i) { string s; cin >> s; t[i] = s[0]; } for (int i = 0; i < n; ++i) { cin >> from[i]; from[i]--; } for (int i = 0; i < n; ++i) { cin >> to[i]; to[i]--; } for (int i = 0; i < n; ++i) { if (from[i] > to[i]) continue; int w = t[i] == 'E' || t[i] == 'C'; a[w][to[i]].push_back(from[i]); } } vector solve() { memset(Q, 0, sizeof(Q)); memset(P, 0, sizeof(P)); vector res(n, (int)1e9); for (int i = 0; i < m; ++i) { for (int j = 0; j < 2; ++j) for (int from : a[j][i]) add(Q[j], P[j], 1, 0, N, 0, from + 1, 1); int best = max( get_max(Q[0], P[0], 1, 0, N, 0, N), get_max(Q[1], P[1], 1, 0, N, 0, N) ); if (best > 0) res[best - 1] = min(res[best - 1], i); for (int j = 0; j < 2; ++j) add(Q[j], P[j], 1, 0, N, i, i + 1, best); } for (int i = n - 2; i >= 0; --i) res[i] = min(res[i], res[i + 1]); for (int i = 0; i < n; ++i) if (res[i] == (int)1e9) res[i] = -1; else res[i]++; return res; } int main() { cin >> t; while (t --> 0) { read(); auto res = solve(); for (int x : res) cout << x << ' '; cout << '\n'; } return 0; }