#include #include #include #include #include #include using namespace std; typedef long long LL; namespace INPUT{ const int L=1<<15; char _buf[L],*S,*T,c; char _gc(){ if(S==T){ T=(S=_buf)+fread(_buf,1,L,stdin); if(S==T) return EOF; } return *S++; } void readc(char &c){ for(c=_gc();c<'A'||c>'Z';c=_gc()); } void readi(int &X){ for(c=_gc();c<'0'||c>'9';c=_gc());X=c&15; for(c=_gc();c>='0'&&c<='9';X=X*10+(c&15),c=_gc()); } } using INPUT::readc; using INPUT::readi; const int Maxn=5E4+5; int N,_N,M; struct NO{ int t,l,r; }a[Maxn]; vector V[2][Maxn]; int f[Maxn],Ans[Maxn]; bool cmp(NO x,NO y){return x.l>1; Build(cl,L,mid),Build(cr,mid+1,R); } void Add(int i,int L,int R,int l,int r,int A){ if(L>=l && R<=r) return (void)(add[i]+=A,mx[i]+=A); int mid=L+R>>1; Tap_Down(i); if(r<=mid) Add(cl,L,mid,l,r,A); else if(l>mid) Add(cr,mid+1,R,l,r,A); else Add(cl,L,mid,l,mid,A),Add(cr,mid+1,R,mid+1,r,A); Updata(i); } int Query(int i,int L,int R,int l,int r){ if(L>=l && R<=r) return mx[i]; int mid=L+R>>1; Tap_Down(i); if(r<=mid) return Query(cl,L,mid,l,r); else if(l>mid) return Query(cr,mid+1,R,l,r); else return max(Query(cl,L,mid,l,mid),Query(cr,mid+1,R,mid+1,r)); } }SEG0,SEG1; void Work(){ readi(M),readi(_N),N=0; for(int i=1;i<=_N;++i) {char c;readc(c),a[i].t=Turn(c);} for(int i=1;i<=_N;++i) readi(a[i].l); for(int i=1;i<=_N;++i) readi(a[i].r); for(int i=1;i<=_N;++i) if(a[i].l=1;--i) for(int j=f[i-1]+1;j<=f[i];++j) Ans[j]=i; for(int i=1;i<=_N;++i)printf("%d ",Ans[i]); puts(""); } int main(){ int test; readi(test); while(test--) Work(); return 0; }