#include using namespace std; const int maxN = 1e5+10; const int base = 1e9+7; struct data { int ch, x, y; } G[maxN]; int N, M, test; vector E[2][maxN]; int seg[2][maxN*8], lz[2][maxN*8], F[2][maxN], ans[maxN]; void LazyUpdate(int op, int k, int l, int r) { seg[op][k] += lz[op][k]; lz[op][k*2] += lz[op][k]; lz[op][k*2+1] += lz[op][k]; lz[op][k] = 0; } void Update(int op, int k, int l, int r, int u, int v, int w) { if (l < r) LazyUpdate(op, k, l, r); if (l > v || r < u) return; if (l >= u && r <= v) { lz[op][k] += w; LazyUpdate(op, k, l, r); return; } int mid = (l + r)/2; Update(op, k*2, l, mid, u, v, w); Update(op, k*2+1, mid+1, r, u, v, w); seg[op][k] = max(seg[op][k*2], seg[op][k*2+1]); } int main() { cin >> test; while (test--) { cin >> M >> N; for (int i=1; i <= M; i++) E[0][i].clear(), E[1][i].clear(); memset(seg, 0, sizeof(seg)); memset(lz, 0, sizeof(lz)); for (int i=1; i <= N; i++) { char ch; cin >> ch; G[i].ch = (ch == 'M' || ch == 'D'); } for (int i=1; i <= N; i++) cin >> G[i].x; for (int i=1; i <= N; i++) cin >> G[i].y; for (int i=1; i <= N; i++) { if (G[i].x <= G[i].y) E[G[i].ch][G[i].y].push_back(G[i].x); ans[i] = base; } for (int i=1; i <= M; i++) { for (int j=0; j < E[0][i].size(); j++) Update(0, 1, 1, M, 1, E[0][i][j], 1); for (int j=0; j < E[1][i].size(); j++) Update(1, 1, 1, M, 1, E[1][i][j], 1); F[0][i] = seg[1][1]; F[1][i] = seg[0][1]; Update(0, 1, 1, M, i, i, F[0][i]); Update(1, 1, 1, M, i, i, F[1][i]); ans[F[0][i]] = min(ans[F[0][i]], i); ans[F[1][i]] = min(ans[F[1][i]], i); } for (int i=N-1; i; i--) ans[i] = min(ans[i], ans[i+1]); for (int i=1; i <= N; i++) if (ans[i] == base) ans[i] = -1; for (int i=1; i <= N; i++) cout << ans[i] << " "; cout << "\n"; } }