#include using namespace std; const int N=100055; /* f[i]=max(max(f[j]+a1[j][i]),max(f[j]+a2[j][i])); */ int n,m,q; char ch[5]; struct node{ int t,s,d; bool operator <(const node &cmp)const{return d>1; if(x<=mid) add(i<<1,l,mid,x,y,v,sig); if(y>mid) add(i<<1|1,mid+1,r,x,y,v,sig); maintain(i,sig); } int query(int i,int l,int r,int x,int y){ if(x<=l&&r<=y)return max(T1max[i],T2max[i]); push_down(i,3); int mid=l+r>>1; int mx=0; if(x<=mid)mx=max(mx,query(i<<1,l,mid,x,y)); if(y>mid)mx=max(mx,query(i<<1|1,mid+1,r,x,y)); maintain(i,3); return mx; } int ans; int main(){ scanf("%d",&q); while(q--){ scanf("%d%d",&m,&n); for(int i=1;i<=n;i++){ scanf("%s",ch); ani[i].t=ani[i].s=ani[i].d=0; if(ch[0]=='E'||ch[0]=='C')ani[i].t=1; else ani[i].t=2; } for(int i=1;i<=n;i++)scanf("%d",&ani[i].s); for(int i=1;i<=n;i++)scanf("%d",&ani[i].d); for(int i=1;i<=n;i++)if(ani[i].s>=ani[i].d)ani[i].s=0; sort(ani+1,ani+n+1); memset(T1max,0,sizeof(T1max)); memset(T2max,0,sizeof(T2max)); memset(T1add,0,sizeof(T1add)); memset(T2add,0,sizeof(T2add)); memset(f,0,sizeof(f)); int poi=1; for(int i=1;i<=m;i++){ while(ani[poi].d==i&&poi<=n){ if(1<=ani[poi].s)add(1,1,m,1,ani[poi].s,1,ani[poi].t); poi++; } f[i]=query(1,1,m,1,i); add(1,1,m,i,i,f[i],3); } for(int i=1;i<=n;i++){ int ans=lower_bound(f+1,f+m+1,i)-f; if(ans==m+1)printf("-1 "); else printf("%d ",ans); } puts(""); } return 0; }