#include using namespace std; typedef pair pii; typedef pair pip; #define x first #define y second #define mp make_pair const int N = 5e4 + 5; int s[N], d[N]; int dp[N]; char c[N][2]; struct END{ char c; int prev; }; vector v[N]; int tree[4*N][2]; int lazy[4*N][2]; void propagate(int now, int l, int r, bool typ) { if (lazy[now][typ] == 0) return; tree[now][typ] += lazy[now][typ]; if (l != r) { lazy[now << 1][typ] += lazy[now][typ]; lazy[now << 1 | 1][typ] += lazy[now][typ]; } lazy[now][typ] = 0; } void update(int now, int l, int r, int a, int b, bool typ, int val) { propagate(now, l, r, 0); propagate(now, l, r, 1); if (r < a || b < l) return; if (a <= l && r <= b) { lazy[now][typ] = val; propagate(now, l, r, 0); propagate(now, l, r, 1); return; } int mid = (l + r) >> 1; update(now << 1, l, mid, a, b, typ, val); update(now << 1 | 1, mid + 1, r, a, b, typ, val); tree[now][0] = max(tree[now << 1][0], tree[now << 1 | 1][0]); tree[now][1] = max(tree[now << 1][1], tree[now << 1 | 1][1]); } int query(int now, int l, int r, int a, int b, bool typ) { propagate(now, l, r, 0); propagate(now, l, r, 1); if (r < a || b < l) return -1; if (a <= l && r <= b) return tree[now][typ]; int mid = (l + r) >> 1; return max(query(now << 1, l, mid, a, b, typ), query(now << 1 | 1, mid + 1, r, a, b, typ)); } int main() { int t; scanf("%d",&t); while(t--) { int n, m; scanf("%d %d",&m, &n); for(int i = 0; i < N; i++) { v[i].clear(); } for(int i = 0; i < 4*N; i++) tree[i][0] = tree[i][1] = lazy[i][0] = lazy[i][1] = 0; for(int i = 1; i <= n; i++) { scanf("%s",c[i]); } for(int i = 1; i <= n; i++) { scanf("%d",&s[i]); } for(int i = 1; i <= n; i++) { scanf("%d",&d[i]); if (d[i] < s[i]) continue; END tmp; tmp.c = c[i][0]; tmp.prev = s[i]; v[d[i]].push_back(tmp); } dp[0] = 0; for(int i = 1; i <= m; i++) { for(END cur : v[i]) { if (cur.c == 'C' || cur.c == 'E') { update(1, 1, m, 1, cur.prev, 0, 1); // printf("upd 0"); } else { update(1, 1, m, 1, cur.prev, 1, 1); // printf("upd 0"); } } dp[i] = 0; dp[i] = max(dp[i], query(1, 1, m, 1, i-1, 0)); // printf("hah %d %d\n",i, dp[i]); dp[i] = max(dp[i], query(1, 1, m, 1, i-1, 1)); update(1, 1, m, i, i, 0, dp[i]); update(1, 1, m, i, i, 1, dp[i]); // printf("dor %d %d\n",i, dp[i]); } vector ans; int animal = 0; for(int i = 1; i <= m; i++) { while(dp[i] > animal) { ans.push_back(i); animal += 1; } } while(ans.size() != n) ans.push_back(-1); bool first = false; for(int num : ans) { if (first) printf(" "); first = true; printf("%d",num); } printf("\n"); } return 0; }