#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define eps 1e-12 #define pi 3.14159265358979323846 #define pb push_back #define mp make_pair #define st first #define nd second #define bgn begin #define ll long long #define ld long double #define ull unsigned long long #define ii pair templateclass sgmntTr { private : struct node { int s; int e; int rght; int lft; int prnt; int lz; Ty v; }; private : vectortr; private : vectorind; private : static const int rngMin=0,rngMax=1,rngSum=2; private : int code; private : Ty calc(int i) { if(tr[i].s==tr[i].e)return tr[i].v; Ty t=calc(tr[i].lft); Ty t2=calc(tr[i].rght); if(code==rngMin)tr[i].v=min(t,t2); else if(code==rngMax)tr[i].v=max(t,t2); else if(code==rngSum)tr[i].v=t+t2; return tr[i].v; } public : void bldTr(int rngCode,Ty a[],int startIdx,int endIdx) { code=rngCode; ind.resize(endIdx-startIdx+10); tr.clear(); node tmp; tmp.s=startIdx; tmp.e=endIdx; tmp.prnt=-1; tr.push_back(tmp); for(int i=0,s,e,mid;i>1; tmp.prnt=i; tmp.s=s; tmp.e=mid; tr.push_back(tmp); tr[i].lft=tr.size()-1; tmp.s=mid+1; tmp.e=e; tr.push_back(tmp); tr[i].rght=tr.size()-1; } tr[0].v=calc(0); } private : void updt2(int frst,int lst,Ty val,int i) { if(tr[i].lz!=0) { if(code==rngSum)tr[i].v+=tr[i].lz*(tr[i].e-tr[i].s+1); else tr[i].v+=tr[i].lz; if(tr[i].s!=tr[i].e) { tr[tr[i].lft].lz+=tr[i].lz; tr[tr[i].rght].lz+=tr[i].lz; } tr[i].lz=0; } if(tr[i].s==tr[i].e) { tr[i].v+=val; tr[i].lz=0; return; } if(frst==tr[i].s && lst==tr[i].e) { if(code==rngSum)tr[i].v+=val*(tr[i].e-tr[i].s+1); else tr[i].v+=val; tr[tr[i].lft].lz+=val; tr[tr[i].rght].lz+=val; tr[i].lz=0; return; } int mid=(tr[i].s+tr[i].e)>>1; if(lst<=mid) { updt2(frst,lst,val,tr[i].lft); } else if(frst>mid) { updt2(frst,lst,val,tr[i].rght); } else { updt2(frst,mid,val,tr[i].lft); updt2(mid+1,lst,val,tr[i].rght); } Ty t=qry2(tr[tr[i].lft].s,tr[tr[i].lft].e,tr[i].lft); Ty t2=qry2(tr[tr[i].rght].s,tr[tr[i].rght].e,tr[i].rght); if(code==rngMin)tr[i].v=min(t,t2); else if(code==rngMax)tr[i].v=max(t,t2); else if(code==rngSum)tr[i].v=t+t2; tr[i].lz=0; } private : Ty qry2(int frst,int lst,int i) { if(tr[i].lz!=0) { if(code==rngSum)tr[i].v+=tr[i].lz*(tr[i].e-tr[i].s+1); else tr[i].v+=tr[i].lz; if(tr[i].s!=tr[i].e) { tr[tr[i].lft].lz+=tr[i].lz; tr[tr[i].rght].lz+=tr[i].lz; } tr[i].lz=0; } if(tr[i].s==tr[i].e)return tr[i].v; if(frst==tr[i].s && lst==tr[i].e)return tr[i].v; int mid=(tr[i].s+tr[i].e)>>1; if(lst<=mid)return qry2(frst,lst,tr[i].lft); else if(frst>mid)return qry2(frst,lst,tr[i].rght); else if(code==rngMin)return min(qry2(frst,mid,tr[i].lft),qry2(mid+1,lst,tr[i].rght)); else if(code==rngMax)return max(qry2(frst,mid,tr[i].lft),qry2(mid+1,lst,tr[i].rght)); else return qry2(frst,mid,tr[i].lft)+qry2(mid+1,lst,tr[i].rght); } public : Ty qry(int frst,int lst) { return qry2(frst,lst,0); } public : void updt(int frst,int lst,Ty val) { updt2(frst,lst,val,0); } }; const int N=5e4+10; int cases,m,n,tmp,mx,dp[N],x[N],s[N],d[N],res[N]; vectorv[4][N]; char t[N]; sgmntTrtr[4]; void solve() { cin>>cases; while(cases--) { cin>>m>>n; for(int i=1;i<=m;i++) { v[1][i].clear(); v[2][i].clear(); x[i]=0; } for(int i=1;i<=n;i++)cin>>t[i]; for(int i=1;i<=n;i++)cin>>s[i]; for(int i=1;i<=n;i++) { cin>>d[i]; if(t[i]=='E'||t[i]=='C')v[1][d[i]].pb(i); else v[2][d[i]].pb(i); res[i]=-1; } tr[1].bldTr(1,x,1,m); tr[2].bldTr(1,x,1,m); dp[1]=0; for(int i=2;i<=m;i++) { mx=0; for(int k=1;k<=2;k++) { for(auto j:v[k][i]) { if(s[j]<=i)tr[k].updt(1,s[j],1); } tmp=tr[k].qry(1,i-1); mx=max(mx,tmp); } dp[i]=max(dp[i-1],mx); tr[1].updt(i,i,dp[i]); tr[2].updt(i,i,dp[i]); if(res[dp[i]]==-1)res[dp[i]]=i; } for(int i=n-1;i>=1;i--) { if(res[i+1]!=-1) { if(res[i]==-1||res[i]>res[i+1])res[i]=res[i+1]; } } for(int i=1;i<=n;i++)cout<