#include #define ls (o << 1) #define rs (o << 1 | 1) using namespace std; const int N = 50005; int tp[N], st[N], ed[N]; inline int id_key(char c) { if (c == 'E') return 0; if (c == 'D') return 1; if (c == 'C') return 2; return 3; } vector animal[2][N]; struct Segtree { int L[N * 4], R[N * 4], mx[N * 4], lz[N * 4]; void push_up(int o) { mx[o] = max(mx[ls], mx[rs]); } void add(int o, int v) { mx[o] += v; lz[o] += v; } void push_down(int o) { add(ls, lz[o]); add(rs, lz[o]); lz[o] = 0; } void build(int o, int l, int r) { L[o] = l; R[o] = r; mx[o] = lz[o] = 0; if (l == r) return; int m = (l + r) >> 1; build(ls, l, m); build(rs, m + 1, r); } int query(int o, int l, int r) { if (L[o] == l && R[o] == r) return mx[o]; push_down(o); int m = (L[o] + R[o]) >> 1; if (r <= m) return query(ls, l, r); if (l > m) return query(rs, l, r); return max(query(ls, l, m), query(rs, m + 1, r)); } void update(int o, int l, int r, int v) { if (L[o] == l && R[o] == r) { add(o, v); return; } push_down(o); int m = (L[o] + R[o]) >> 1; if (r <= m) update(ls, l, r, v); else if (l > m) update(rs, l, r, v); else { update(ls, l, m, v); update(rs, m + 1, r, v); } push_up(o); } } t[2]; int dp[N], ans[N]; int main() { int T; scanf("%d", &T); while (T--) { int m, n; scanf("%d%d", &m, &n); for (int i = 1; i <= n; ++i) { char s[2]; scanf("%s", s); tp[i] = id_key(*s); } for (int i = 1; i <= n; ++i) scanf("%d", st + i); for (int i = 1; i <= n; ++i) scanf("%d", ed + i); for (int i = 1; i <= n; ++i) { if (st[i] > ed[i]) continue; animal[tp[i] & 1][ed[i]].push_back(st[i]); } for (int k = 0; k < 2; ++k) for (int i = 1; i <= m; ++i) sort(animal[k][i].begin(), animal[k][i].end()); t[0].build(1, 1, m); t[1].build(1, 1, m); for (int i = 1; i <= m; ++i) { for (int k = 0; k < 2; ++k) { int mx = 0; int sz = animal[k][i].size(); for (int j = 0; j < sz; ++j) { int p = animal[k][i][j]; int v = t[k ^ 1].query(1, 1, p); mx = max(mx, v + sz - j); } t[k].update(1, i, i, mx); } for (int k = 0; k < 2; ++k) { int pre = 1, sz = animal[k][i].size(); for (int c, j = 0; j < sz; j = c) { int p = animal[k][i][j]; for (c = j + 1; c < sz && animal[k][i][c] == p; ++c); t[k ^ 1].update(1, pre, p, sz - j); pre = p + 1; } } dp[i] = max(t[0].mx[1], t[1].mx[1]); } for (int i = 1; i <= n; ++i) ans[i] = 1 << 30; for (int i = 1; i <= m; ++i) ans[dp[i]] = min(ans[dp[i]], i); for (int i = dp[m] - 1; i >= 1; --i) ans[i] = min(ans[i], ans[i + 1]); for (int i = dp[m] + 1; i <= n; ++i) ans[i] = -1; for (int i = 1; i <= n; ++i) printf("%d%c", ans[i], i == n ? '\n' : ' '); for (int i = 1; i <= m; ++i) { animal[0][i].clear(); animal[1][i].clear(); } } return 0; }