#include #include #include #include #include #include #define ll long long using namespace std; vector EC[55555]; vector DM[55555]; int source[55555]; int dest[55555]; int ans[55555]; string types[55555]; int best[2][55555]; int blockadd[2][55555]; int blockmax[2][55555]; void Reset(int m) { int block_size = max((int)sqrt(m),1); int num_blocks = (m+block_size-1)/block_size; for(int b=1;b<=num_blocks;b++) { blockadd[0][b]=blockadd[1][b]=blockmax[0][b]=blockmax[1][b]=0; } for(int i=1;i<=m;i++) { best[0][i]=best[1][i]=0; } } void RangeAdd(int which, int en, int m) { // 1 to en int block_size = max((int)sqrt(m),1); int num_blocks = (m+block_size-1)/block_size; for(int b=1;b<=num_blocks;b++) { int stb = (b-1)*block_size+1; int enb = min(b*block_size,m); if (stb > en) break; if (enb <= en) { blockadd[which][b]++; } else { for(int i=stb;i<=en;i++) { best[which][i]++; } blockmax[which][b]=0; for(int i=stb;i<=enb;i++) { blockmax[which][b]=max(blockmax[which][b],best[which][i]); } } } } void Update(int which, int pos, int value, int m) { int block_size = max((int)sqrt(m),1); int b = (pos-1)/block_size+1; best[which][pos]=value; blockmax[which][b]=max(blockmax[which][b],value); } int RangeMax(int which, int en, int m) { int block_size = max((int)sqrt(m),1); int num_blocks = (m+block_size-1)/block_size; int ret=0; for(int b=1;b<=num_blocks;b++) { int stb = (b-1)*block_size+1; int enb = min(b*block_size,m); if (stb > en) break; if (enb <= en) { ret = max(ret, blockmax[which][b]+blockadd[which][b]); } else { for(int i=stb;i<=en;i++) { ret = max(ret,best[which][i]+blockadd[which][b]); } } } return ret; } void Solve(int m,int n) { int Inf = 1111111111; for(int i=1;i<=n;i++) ans[i]=Inf; Reset(m); for(int en=1;en<=m;en++) { for(int st : EC[en]) { RangeAdd(0,st,m); } for(int st : DM[en]) { RangeAdd(1,st,m); } int curr = max(RangeMax(0,en-1,m),RangeMax(1,en-1,m)); Update(0, en, curr, m); Update(1, en, curr, m); ans[curr]=min(ans[curr], en); } for(int i=n-1;i>=1;i--) ans[i]=min(ans[i],ans[i+1]); for(int i=1;i<=n;i++) { if (ans[i]==Inf) ans[i]=-1; printf("%d ",ans[i]); } printf("\n"); } int main() { int T; cin>>T; for(int t=1;t<=T;t++) { int m,n; cin>>m>>n; for(int i=1;i<=n;i++) { cin>>types[i]; } for(int i=1;i<=m;i++) { EC[i].clear(); DM[i].clear(); } for(int i=1;i<=n;i++) cin>>source[i]; for(int i=1;i<=n;i++) cin>>dest[i]; for(int i=1;i<=n;i++) { if (source[i] > dest[i]) continue; int s=source[i]; int t=dest[i]; if (types[i]=="E" || types[i]=="C") { EC[t].push_back(s); } else { DM[t].push_back(s); } } for(int i=1;i<=m;i++) { sort(EC[i].begin(),EC[i].end(),greater()); sort(DM[i].begin(),DM[i].end(),greater()); } Solve(m,n); } }