#include using namespace std; //#define FILE_IO int N, M; int dp[50005]; int type[50005], st[50005], dr[50005]; int ans[50005]; vector v[2][50005]; class SegmentTree { public: int ans, aint[400005], add[400005]; void B(int nod, int st, int dr) { aint[nod] = add[nod] = 0; if(st == dr) return; int mij = st + (dr - st) / 2; B(nod * 2, st, mij); B(nod * 2 + 1, mij + 1, dr); } void split(int nod, int st, int mij, int dr) { if(!add[nod]) return; U(nod * 2, st, mij, st, dr, add[nod]); U(nod * 2 + 1, mij + 1, dr, st, dr, add[nod]); add[nod] = 0; } void U(int nod, int st, int dr, int sti, int dri, int val) { if(sti <= st && dr <= dri) { aint[nod] += val; add[nod] += val; return; } int mij = st + (dr - st) / 2; split(nod, st, mij, dr); if(sti <= mij) U(nod * 2, st, mij, sti, dri, val); if(mij < dri) U(nod * 2 + 1, mij + 1, dr, sti, dri, val); aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]); } void Q(int nod, int st, int dr, int sti, int dri) { if(sti <= st && dr <= dri) { ans = max(ans, aint[nod]); return; } int mij = st + (dr - st) / 2; split(nod, st, mij, dr); if(sti <= mij) Q(nod * 2, st, mij, sti, dri); if(mij < dri) Q(nod * 2 + 1, mij + 1, dr, sti, dri); } void update(int st, int dr, int val) { U(1, 1, N, st, dr, val); } int query(int st, int dr) { ans = 0; Q(1, 1, N, st, dr); return ans; } void build() { B(1, 1, N); } }; SegmentTree aint[2]; void solve_test() { scanf("%d%d", &N, &M); for(int i = 1; i <= N; i++) { v[0][i].clear(); v[1][i].clear(); } for(int i = 1; i <= M; i++) { char c = getchar(); c = getchar(); if(c == 'E' || c == 'C') type[i] = 0; else if(c == 'D' || c == 'M') type[i] = 1; } for(int i = 1; i <= M; i++) scanf("%d", &st[i]); for(int i = 1; i <= M; i++) scanf("%d", &dr[i]); for(int i = 1; i <= M; i++) { if(st[i] > dr[i]) continue; v[ type[i] ][ dr[i] ].push_back(st[i]); } aint[0].build(); aint[1].build(); dp[1] = 0; for(int i = 2; i <= N; i++) { for(int j = 0; j < 2; j++) for(auto x: v[j][i]) aint[j].update(1, x, 1); dp[i] = max(aint[0].query(1, N), aint[1].query(1, N)); aint[0].update(i, i, dp[i]); aint[1].update(i, i, dp[i]); } int lst = 0; for(int i = 1; i <= M; i++) ans[i] = -1; for(int i = 1; i <= N; i++) { for(int j = lst + 1; j <= dp[i]; j++) ans[j] = i; lst = max(lst, dp[i]); } for(int i = 1; i <= M; i++) printf("%d ", (ans[i] == 0 ? -1 : ans[i])); printf("\n"); } int main() { #ifdef FILE_IO freopen("1.in", "r", stdin); freopen("1.out", "w", stdout); #endif int T; scanf("%d", &T); for(int t = 1; t <= T; t++) solve_test(); return 0; }