#include using namespace std; #define ll long long #define db double #define up(i,j,n) for (int i = j; i <= n; i++) #define down(i,j,n) for (int i = j; i >= n; i--) #define cadd(a,b) a = add (a, b) #define cpop(a,b) a = pop (a, b) #define cmul(a,b) a = mul (a, b) #define pr pair #define fi first #define se second #define SZ(x) (int)x.size() #define bin(i) (1 << (i)) #define Auto(i,node) for (int i = LINK[node]; i; i = e[i].next) template inline bool cmax(T & x, T y){return y > x ? x = y, true : false;} template inline bool cmin(T & x, T y){return y < x ? x = y, true : false;} const int MAXN = 5e4 + 5; const int oo = 0x3f3f3f3f; int T, N, M, st[MAXN], ed[MAXN], f[2][MAXN], ans[MAXN]; char s[MAXN][5]; vector pos[2][MAXN]; struct Seg { struct tree { int tag, mx; }t[MAXN << 2]; void mark(int k, int v){ t[k].mx += v; t[k].tag += v; } void Pushdown(int k){ if (t[k].tag == 0) return; mark(k << 1, t[k].tag); mark(k << 1 | 1, t[k].tag); t[k].tag = 0; } void rel(int k){ t[k].mx = max(t[k << 1].mx, t[k << 1 | 1].mx); } void Build(int le, int ri, int k) { t[k].mx = t[k].tag = 0; if (le == ri) return; int mi = (le + ri) >> 1; Build(le, mi, k << 1); Build(mi + 1, ri, k << 1 | 1); } void sadd(int le, int ri, int k, int L, int R, int v){ if (le != ri) Pushdown(k); if (L <= le && ri <= R) { mark(k, v); return; } int mi = (le + ri) >> 1; if (L <= mi) sadd(le, mi, k << 1, L, R, v); if (mi + 1 <= R) sadd(mi + 1, ri, k << 1 | 1, L, R, v); rel(k); } int get(int le, int ri, int k, int L, int R){ if (le != ri) Pushdown(k); if (L <= le && ri <= R) return t[k].mx; int mi = (le + ri) >> 1, mx = 0; if (L <= mi) cmax(mx, get(le, mi, k << 1, L, R)); if (mi + 1 <= R) cmax(mx, get(mi + 1, ri, k << 1 | 1, L, R)); return mx; } void cg(int le, int ri, int k, int o, int v){ if (le != ri) Pushdown(k); if (le == ri) { cmax(t[k].mx, v); return; } int mi = (le + ri) >> 1; if (o <= mi) cg(le, mi, k << 1, o, v); else cg(mi + 1, ri, k << 1 | 1, o, v); rel(k); } }S[2]; int main(){ scanf("%d", &T); while (T--) { scanf("%d%d", &N, &M); up (i, 0, 1) up (j, 1, N)if (!pos[i][j].empty()) pos[i][j].erase(pos[i][j].begin(), pos[i][j].end()); up (i, 0, 1) up (j, 0, N) f[i][j] = 0; up (i, 0, 1) S[i].Build(0, N, 1); up (i, 1, M) scanf("%s", s[i]); up (i, 1, M) scanf("%d", &st[i]); up (i, 1, M) scanf("%d", &ed[i]); up (i, 1, M) { int t = 0, le = st[i], ri = ed[i]; if (s[i][0] == 'D' || s[i][0] == 'M') t = 1; if (le >= ri) continue; pos[t][ri - 1].push_back(le); } up (i, 1, N) { up (t, 0, 1) up (j, 0, SZ(pos[t][i]) - 1) S[t ^ 1].sadd(0, N, 1, 0, pos[t][i][j] - 1, 1); up (t, 0, 1) f[t][i] = S[t ^ 1].get(0, N, 1, 0, i); up (t, 0, 1) S[t].cg(0, N, 1, i, f[t][i]); } up (i, 1, M) ans[i] = oo; down (i, N, 1) { ans[f[0][i]] = i; ans[f[1][i]] = i; } down (i, M - 1, 1) cmin(ans[i], ans[i + 1]); up (i, 1, M) printf("%d ", ans[i] == oo ? -1 : (ans[i] + 1)); puts(""); } return 0; }