#include using namespace std; typedef long long ll; //const int INF = (int)1.01e9; struct segtree { int n, N; vector t; vector p; segtree() {} segtree(int _n) { n = _n; N = 1; while (N <= n) N <<= 1; N <<= 1; t.assign(2 * N, 0); p.assign(2 * N, 0); } void push(int v, int tl, int tr) { if (p[v] == 0) return; if (tl != tr) { p[v * 2] += p[v]; p[v * 2 + 1] += p[v]; } t[v] += p[v]; p[v] = 0; } void upd(int v, int tl, int tr, int l, int r, int x) { push(v, tl, tr); if (l > r) return; if (l == tl && r == tr) { p[v] += x; push(v, tl, tr); return; } int tm = (tl + tr) >> 1; upd(v * 2, tl, tm, l, min(r, tm), x); upd(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r, x); t[v] = max(t[v * 2], t[v * 2 + 1]); } void upd(int l, int r, int x) { upd(1, 0, n - 1, l, r, x); } int get(int v, int tl, int tr, int l, int r) { push(v, tl, tr); if (l > r) return -1; if (l == tl && r == tr) return t[v]; int tm = (tl + tr) >> 1; return max(get(v * 2, tl, tm, l, min(r, tm)), get(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r)); } int get(int l, int r) { return get(1, 0, n - 1, l, r); } }; int main() { #ifdef HOME freopen("in", "r", stdin); #endif int T; scanf("%d", &T); while (T--) { int m, n; scanf("%d%d", &m, &n); vector t(n), s(n), d(n); for (int i = 0; i < n; i++) { char c; scanf(" %c", &c); t[i] = c == 'D' || c == 'M'; } for (int i = 0; i < n; i++) { scanf("%d", &s[i]); s[i]--; } for (int i = 0; i < n; i++) { scanf("%d", &d[i]); d[i]--; d[i]--; } vector > > e(m + 1, vector >(2)); for (int i = 0; i < n; i++) { if (s[i] > d[i]) continue; e[d[i]][t[i]].push_back(s[i]); } vector tr(2); for (int i = 0; i < 2; i++) { tr[i] = segtree(m + 1); } vector dp(m + 1); for (int i = 0; i < m; i++) { for (int j = 0; j < 2; j++) { int best = 0; for (int fr : e[i][j]) { tr[j ^ 1].upd(0, fr, +1); } tr[j].upd(i + 1, i + 1, tr[j ^ 1].get(0, i)); } dp[i + 1] = max(tr[0].get(i + 1, i + 1), tr[1].get(i + 1, i + 1)); } vector ans(n + 1, -1); for (int i = 1; i <= m; i++) dp[i] = max(dp[i], dp[i - 1]); for (int i = 1; i <= m; i++) { if (dp[i] != dp[i - 1]) { ans[dp[i]] = i; } } for (int i = n - 1; i >= 1; i--) { if (ans[i] == -1) ans[i] = ans[i + 1]; } for (int i = 1; i <= n; i++) if (ans[i] != -1) ans[i]++; for (int i = 1; i <= n; i++) printf("%d%c", ans[i], " \n"[i == n]); } return 0; }