#include #include #include #include #include #include #include #include #include #include #include #define INF 1000000000ll #define MOD 1000000007ll #define EPS 1e-10 #define REP(i,m) for(long long i=0; i P; typedef long double ld; class RMQ { #define RMQ_MAX ((1ll<<60)-1) public: RMQ(int n) { _n=1; while(_n0) { k=(k-1)/2; _dat[k]=max(_dat[k*2+1],_dat[k*2+2]); } } // return the minimum number in [a,b) // external call should be written like query(a,b,0,0,_n) ll query(int a,int b,int k=0,int l=0,int r=-1) { if(r==-1) r=_n; if(r<=a||b<=l) return 0; if(a<=l&&r<=b) return _dat[k]; else { ll vl=query(a,b,k*2+1,l,(l+r)/2); ll vr=query(a,b,k*2+2,(l+r)/2,r); return max(vl,vr); } } private: int _n; vector _dat; }; class RSQ { public: RSQ(int n) { _n=1; while(_n0) { k=(k-1)/2; _dat[k]+=a; } } // return the sum of [a,b) // external call should be written like query(a,b,0,0,_n) ll query(int a,int b,int k=0,int l=0,int r=-1) { if(r==-1) r=_n; if(r<=a||b<=l) return 0; if(a<=l&&r<=b) return _dat[k]; else { ll vl=query(a,b,k*2+1,l,(l+r)/2); ll vr=query(a,b,k*2+2,(l+r)/2,r); return vl+vr; } } private: int _n; vector _dat; }; int main() { cin.tie(0); ios::sync_with_stdio(false); ll test; cin>>test; REP(roop,test) { ll m,n; cin>>m>>n; vector t(n); REP(i,n) { char c; cin>>c; if(c=='E') { t[i]=0; } if(c=='D') { t[i]=1; } if(c=='C') { t[i]=2; } if(c=='M') { t[i]=3; } } vector> sd(n); REP(i,n) cin>>sd[i].first.first; REP(i,n) cin>>sd[i].first.second; REP(i,n) { sd[i].first.first--; sd[i].first.second--; sd[i].second=i; swap(sd[i].first.first,sd[i].first.second); } sort(ALL(sd)); vector> tmp1(m); RSQ tmp_o((int)(m+1)); RSQ tmp_e((int)(m+1)); vector w(n); REP(i,n) tmp1[sd[i].first.first].pb(P(sd[i].first.second,sd[i].second)); REP(i,m) { REP(j,(ll)tmp1[i].size()) { if(t[tmp1[i][j].second]%2) { tmp_o.update((int)tmp1[i][j].first,1); } else { tmp_e.update((int)tmp1[i][j].first,1); } } REP(j,(ll)tmp1[i].size()) { if(t[tmp1[i][j].second]%2) { w[tmp1[i][j].second]=tmp_o.query((int)tmp1[i][j].first,(int)m); } else { w[tmp1[i][j].second]=tmp_e.query((int)tmp1[i][j].first,(int)m); } } } RMQ dpe_o((int)(m+1)); RMQ dpe_e((int)(m+1)); RMQ dps_o((int)(m+1)); RMQ dps_e((int)(m+1)); REP(i,m) { REP(j,(ll)tmp1[i].size()) { if(t[tmp1[i][j].second]%2) { ll buf=max(dpe_e.query(0,tmp1[i][j].first+1),dps_o.query(0,tmp1[i][j].first))+w[tmp1[i][j].second]; dpe_o.update(i,max(buf,dpe_o.query(i,i+1))); dps_o.update(tmp1[i][j].first,max(buf,dps_o.query(tmp1[i][j].first,tmp1[i][j].first+1))); } else { ll buf=max(dpe_o.query(0,tmp1[i][j].first+1),dps_e.query(0,tmp1[i][j].first))+w[tmp1[i][j].second]; dpe_e.update(i,max(buf,dpe_e.query(i,i+1))); dps_e.update(tmp1[i][j].first,max(buf,dps_e.query(tmp1[i][j].first,tmp1[i][j].first+1))); } } } vector ans(n+1,-1); ll lb=0; REP(i,m) { ll buf=max(dpe_o.query(i,i+1),dpe_e.query(i,i+1)); if(buf==0) continue; FOR(j,lb,buf+1) { ans[j]=i+1; } lb=buf+1; } FOR(i,1,n+1) { cout<