#include #define me(a,x) memset(a,x,sizeof a) #define cp(a,x) memcpy(a,x,sizeof a) using namespace std; typedef long long LL; const int N=5e4+2,mod=1e9; char O[1<<14],*S=O,*T=O; #define gc (S==T&&(T=(S=O)+fread(O,1,1<<14,stdin),S==T)?-1:*S++) inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0' && ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();} return x*f; } int m,n,f[N],g[N]; struct P{int x,y; bool v;}a[N]; int Cmp(P x,P y){ return x.y>1; if(qr<=mid) add(lc,l,mid,ql,qr,u); else if(ql>mid) add(rc,mid+1,r,ql,qr,u); else add(lc,l,mid,ql,mid,u),add(rc,mid+1,r,mid+1,qr,u); s[x][0]=max(s[lc][0],s[rc][0]); s[x][1]=max(s[lc][1],s[rc][1]); } void gai(int x,int l,int r,int k,int u){ if(l==r){ s[x][0]=s[x][1]=u; return; } pd(x); int lc=x<<1,rc=lc|1,mid=l+r>>1; if(k<=mid) gai(lc,l,mid,k,u); else gai(rc,mid+1,r,k,u); s[x][0]=max(s[lc][0],s[rc][0]); s[x][1]=max(s[lc][1],s[rc][1]); } int get(int x,int l,int r,int ql,int qr){ if(l==ql && r==qr) return max(s[x][0],s[x][1]); pd(x); int lc=x<<1,rc=lc|1,mid=l+r>>1; if(qr<=mid) return get(lc,l,mid,ql,qr); else if(ql>mid) return get(rc,mid+1,r,ql,qr); return max(get(lc,l,mid,ql,mid),get(rc,mid+1,r,mid+1,qr)); } int main(){ int T=read(),i; while(T--){ m=read(),n=read(); for(i=1;i<=n;++i){ char ch; scanf("\n%c",&ch); if(ch=='E'||ch=='C')a[i].v=0; else a[i].v=1; } for(i=1;i<=n;++i)a[i].x=read(); for(i=1;i<=n;++i)a[i].y=read(); sort(a+1,a+1+n,Cmp); me(s,0); me(tg,0); int j=1; for(i=1;i<=m;++i){ while(j<=n && a[j].y==i){ if(a[j].x1)f[i]=get(1,1,m,1,i-1); else f[i]=0; gai(1,1,m,i,f[i]); } me(g,-1); for(i=1;i<=m;++i) if(g[f[i]]==-1)g[f[i]]=i; for(i=n;i>0;--i) if(g[i]==-1)g[i]=g[i+1]; for(i=1;i