#include using namespace std; typedef pair pii; const int maxN = 50000 + 10, maxT = (1<<18); int m, n; vector E[maxN]; int F[maxN]; int B[2][maxT], inc[2][maxT], R[maxN]; void update_inc(int i) { if (i < maxT) { B[0][i] += inc[0][i]; B[1][i] += inc[1][i]; if (i*2+1 < maxT){ inc[0][i*2] += inc[0][i]; inc[0][i*2+1] += inc[0][i]; inc[1][i*2] += inc[1][i]; inc[1][i*2+1] += inc[1][i]; } inc[0][i] = 0; inc[1][i] = 0; } } void update_b(int i) { B[0][i] = max(B[0][i*2], B[0][i*2+1]); B[1][i] = max(B[1][i*2], B[1][i*2+1]); } void add_val(int i, int l, int r, int s, int e, int j) { update_inc(i); if (l > e || r < s) return; if (s <= l && r <= e) { inc[j][i] += 1; update_inc(i); return; } int mid = (l + r) / 2; add_val(i*2, l, mid, s, e, j); add_val(i*2+1, mid+1, r, s, e, j); update_b(i); } void change_val(int i, int l, int r, int s, int v) { update_inc(i); if (l > s || r < s) return; if (s <= l && r <= s) { B[0][i] = B[1][i] = v; return; } int mid = (l + r) / 2; change_val(i*2, l, mid, s, v); change_val(i*2+1, mid+1, r, s, v); update_b(i); } void solve() { F[0] = 0; memset(B, 0, sizeof B); memset(inc, 0, sizeof inc); int nr = 1; for (int i = 1; i <= m; i++) { // inc value for (auto p: E[i]) { add_val(1, 1, m, 1, p.first, p.second); } // get value F[i] = max(B[0][1], B[1][1]); // printf("F[%d] = %d\n", i, F[i]); // update value change_val(1, 1, m, i, F[i]); // update R while (nr <= F[i]) { R[nr++] = i; } } while (nr <= n) R[nr++] = -1; for (int i = 1; i <= n; i++) printf("%d%c", R[i], " \n"[i==n]); } int main() { int t; scanf("%d", &t); while (t--) { scanf("%d%d", &m, &n); vector T(n), S(n), D(n); char ss[4]; for (int i = 0; i <= m+1; i++) { E[i].clear(); } for (int i = 0; i < n; i++) { scanf("%s", ss); T[i] = (ss[0] == 'E' || ss[0] == 'C'); // elephant or cat } for (int i = 0; i < n; i++) { scanf("%d", &S[i]); } for (int i = 0; i < n; i++) { scanf("%d", &D[i]); assert(S[i] != D[i]); if (S[i] < D[i]) E[D[i]].push_back(make_pair(S[i], T[i])); } solve(); } return 0; }