#include using namespace std; const int N = 50005; int n, m, s[N], d[N]; char t[N]; int cn0[N]; int cn1[N]; int ans[N]; int dp[N]; vector e0[N]; vector e1[N]; int T[N * 4][2]; int P[N * 4][2]; void clean(){ for(int i = 0; i < N; ++i){ e0[i].clear(); e1[i].clear(); } memset(cn0, 0, sizeof(cn0)); memset(cn1, 0, sizeof(cn1)); memset(dp, 0, sizeof(dp)); memset(T, 0, sizeof(T)); memset(P, 0, sizeof(P)); } void propagate(int node, int p){ int l = 2 * node, h = l + 1; T[l][p] += P[node][p]; P[l][p] += P[node][p]; T[h][p] += P[node][p]; P[h][p] += P[node][p]; P[node][p] = 0; } void update(int b, int e, int node, int x, int y, int val, int p){ if(y < b || e < x) return; if(b >= x && e <= y){ T[node][p] += val; P[node][p] += val; return; } if(P[node][p]) propagate(node, p); int mid = (b + e) / 2, l = 2 * node, h = l + 1; update(b, mid, l, x, y, val, p); update(mid + 1, e, h, x, y, val, p); T[node][p] = max(T[l][p], T[h][p]); } int query(int b, int e, int node, int x, int y, int p){ if(y < b || e < x || x > y) return 0; if(b >= x && e <= y) return T[node][p]; if(P[node][p]) propagate(node, p); int mid = (b + e) / 2, l = 2 * node, h = l + 1; return max(query(b, mid, l, x, y, p), query(mid + 1, e, h, x, y, p)); } int main(){ int tc; scanf("%d", &tc); while(tc--){ clean(); scanf("%d %d", &m, &n); for(int i = 1; i <= n; ++i) scanf(" %c", &t[i]); for(int i = 1; i <= n; ++i) scanf("%d", &s[i]); for(int i = 1; i <= n; ++i) scanf("%d", &d[i]); for(int i = 1; i <= n; ++i){ if(s[i] > d[i]) continue; if(t[i] == 'C' || t[i] == 'E') e0[d[i]].push_back(s[i]); else e1[d[i]].push_back(s[i]); } for(int i = 1; i <= m; ++i){ for(auto u : e0[i]) update(1, m, 1, 1, u, +1, 0); for(auto u : e1[i]) update(1, m, 1, 1, u, +1, 1); dp[i] = max(T[1][0], T[1][1]); update(1, m, 1, i, i, dp[i], 0); update(1, m, 1, i, i, dp[i], 1); } memset(ans, -1, sizeof(ans)); int idx = 1; for(int i = 1; i <= m; ++i){ while(idx <= n && dp[i] >= idx){ ans[idx++] = i; } } for(int i = 1; i <= n; ++i) printf("%d ", ans[i]); printf("\n"); } return 0; }