#include using namespace std; typedef long long LL; const int N = 100005; const int NN = N*4; int lazy[2][NN], tree[2][NN]; int loai[N], src[N], f[N]; void build(int nd, int l, int r) { lazy[0][nd] = lazy[1][nd] = tree[0][nd] = tree[1][nd] = 0; if (l == r) { return; } int m = (l+r) >> 1; int cc = nd << 1; build(cc, l, m); build(cc^1, m+1, r); } void push(int id, int nd, bool leaf) { if (lazy[id][nd] == 0) return; tree[id][nd] += lazy[id][nd]; if (!leaf) { int cc = nd << 1; lazy[id][cc] += lazy[id][nd]; lazy[id][cc^1] += lazy[id][nd]; } lazy[id][nd] = 0; } void add(int id, int nd, int l, int r, int tr, int ph, int val) { push(id, nd, l==r); if (r < tr || l > ph) return; if (tr <= l && r <= ph) { lazy[id][nd] += val; push(id, nd, l==r); return; } int m = (l+r) >> 1; int cc = nd << 1; add(id, cc, l, m, tr, ph, val); add(id, cc^1, m+1, r, tr, ph, val); tree[id][nd] = max(tree[id][cc], tree[id][cc^1]); } int query(int id, int nd, int l, int r, int tr, int ph) { push(id, nd, l==r); if (r < tr || l > ph) return 0; if (tr <= l && r <= ph) return tree[id][nd]; int m = (l+r) >> 1; int cc = nd << 1; return max(query(id,cc,l,m,tr,ph),query(id,cc^1,m+1,r,tr,ph)); } void solve() { int m, n; scanf("%d%d", &m, &n); vector> ds[2]; for (int i = 0; i < 2; i++) ds[i].resize(m+1); for (int i = 0; i < n; i++) { char c; scanf(" %c", &c); if (c == 'D' || c == 'M') c = 0; else c = 1; loai[i] = c; } for (int i = 0; i < n; i++) { scanf("%d", src+i); } for (int i = 0; i < n; i++) { int dst; scanf("%d", &dst); if (src[i] > dst) continue; ds[loai[i]][dst].push_back(src[i]); } build(1,1,m); f[0] = 0; for (int i = 1; i <= m; i++) { f[i] = 0; for (int j = 0; j < 2; ++j) { for (int z : ds[j][i]) { add(j,1,1,m,1,z,1); } int t = query(j,1,1,m,1,i-1); f[i] = max(f[i], t); } for (int j = 0; j < 2; ++j) { add(j,1,1,m,i,i,f[i]); } } for (int i = 1, j = 1; i <= n; i++) { while (j <= m && f[j] < i) ++j; if (j > m) printf("-1 "); else printf("%d ", j); } printf("\n"); } int main() { int ct; scanf("%d", &ct); while (ct--) solve(); }