#include #include #include #include using namespace std; typedef long long LL; const int N = 50050; struct ani{ int l, r, tp; bool operator < (const ani &b)const{ return r < b.r; } }A[N]; char s[5]; #define lc (p << 1) #define rc (p << 1|1) int n, m, f[N], ans[N]; struct seg{ int mx[4 * N], tag[4 * N]; void paint(int p, int x){ mx[p] += x; tag[p] += x; } void tagdown(int p){ if(tag[p] > 0){ paint(lc, tag[p]); paint(rc, tag[p]); tag[p] = 0; } } void add(int p, int l, int r, int x, int y, int num){ if(l == x&&r == y){ paint(p, num); return; } int md = l + r >>1; tagdown(p); if(y <= md)add(lc, l, md, x, y, num); else if(x > md)add(rc, md + 1, r, x, y, num); else{ add(lc, l, md, x, md, num); add(rc, md + 1, r, md + 1, y, num); } mx[p] = max(mx[lc], mx[rc]); } int query(int p, int l, int r, int x, int y){ if(l == x&&r == y) return mx[p]; int md = l + r >>1, ret; tagdown(p); if(y <= md)ret = query(lc, l, md, x, y); else if(x > md)ret = query(rc, md + 1, r, x, y); else ret = max(query(lc, l, md, x, md), query(rc, md + 1, r, md + 1, y)); mx[p] = max(mx[lc], mx[rc]); return ret; } void clear(){ memset(mx, 0, sizeof(mx)); memset(tag, 0, sizeof(tag)); } }TA, TB; namespace io{ const int L=(1<<19)+1; char ibuf[L],*iS,*iT,obuf[L],*oS=obuf,*oT=obuf+L-1,c,st[55];int f,tp; inline char gc(){ if(iS==iT){ iT=(iS=ibuf)+fread(ibuf,1,L,stdin); return iS==iT?EOF:*iS++; } return*iS++; } inline void cbuf(){fwrite(obuf,1,oS-obuf,stdout);oS=obuf;} inline void putc(char x){*oS++=x;if(oS==oT)cbuf();} templatevoid print(T x){ if(!x)putc('0');if(x<0)putc('-'),x=-x; while(x)st[++tp]=x%10+'0',x/=10; while(tp)putc(st[tp--]); putc(' '); } void gs(char *s){ for(c=gc();c<'A'||c>'Z';c=gc()); for(;c>='A'&&c<='Z';c=gc()) *s++=c; *s++='\0'; } templatevoid gi(I &x){ for(f=1,c=gc();c<'0'||c>'9';c=gc())if(c=='-')f=-1; for(x=0;c<='9'&&c>='0';c=gc())x=x*10+(c&15);x*=f; } }; using io::print; using io::gi; using io::gs; int main(){ int i, j, k, T; gi(T); while(T --){ gi(m), gi(n); TA.clear(), TB.clear(); for(i = 1, ans[n + 1] = -1; i <= n; i ++){ gs(s + 1); ans[i] = -1; if(s[1] == 'E'||s[1] == 'C') A[i].tp = 1; else A[i].tp = 2; } for(i = 1; i <= n; i ++) gi(A[i].l); for(i = 1; i <= n; i ++) gi(A[i].r); sort(A + 1, A + n + 1); for(i = j = 1; i <= m; i ++){ f[i] = f[i - 1]; while(j <= n&&A[j].r == i){ if(A[j].l > A[j].r){ j ++; continue; } if(A[j].tp == 1) TB.add(1, 0, m, 0, A[j].l, 1); else TA.add(1, 0, m, 0, A[j].l, 1); j ++; } f[i] = max(f[i], TA.query(1, 0, m, 0, i - 1)); f[i] = max(f[i], TB.query(1, 0, m, 0, i - 1)); TA.add(1, 0, m, i, i, f[i]); TB.add(1, 0, m, i, i, f[i]); if(ans[f[i]] == -1) ans[f[i]] = i; } for(i = n; i >= 1; i --) if(ans[i] == -1) ans[i] = ans[i + 1]; for(i = 1; i <= n; i ++) print(ans[i]); io :: putc('\n'); } io :: cbuf(); return 0; }