#include using namespace std; typedef long long ll; const int N = 5e4+111; const int INF = 1e9; int idx[256]; char name[4] = {'E','D','C','M'}; int test, m, n, res[N], dp[N][4]; struct Data{ int l, r, id; char type; } A[N]; bool operator < (const Data &a, const Data &b){ return (a.ly) x = y; } struct SegTree{ int Max[2][4*N], Lazy[2][4*N]; void build(){ memset(Lazy,0,sizeof(Lazy)); memset(Max,0,sizeof(Max)); } void down(int t, int id, int l, int r){ if(!Lazy[t][id]) return; Max[t][id] += Lazy[t][id]; if(l!=r){ Lazy[t][2*id] += Lazy[t][id]; Lazy[t][2*id+1] += Lazy[t][id]; } Lazy[t][id] = 0; } void add(int t, int id, int l, int r, int u, int v){ down(t,id,l,r); if(r>1; add(t,2*id,l,mid,u,v); add(t,2*id+1,mid+1,r,u,v); Max[t][id] = max(Max[t][2*id],Max[t][2*id+1]); } void update(int t, int id, int l, int r, int x, int val){ down(t,id,l,r); if(x>1; update(t,2*id,l,mid,x,val); update(t,2*id+1,mid+1,r,x,val); Max[t][id] = max(Max[t][2*id],Max[t][2*id+1]); } int get(int t, int id, int l, int r, int u, int v){ down(t,id,l,r); if(r>1; return max(get(t,2*id,l,mid,u,v),get(t,2*id+1,mid+1,r,u,v)); } } ST; int main() { ios_base::sync_with_stdio(0); cin.tie(0); idx['E'] = 0; idx['D'] = 1; idx['C'] = 0; idx['M'] = 1; cin>>test; while(test--){ cin>>m>>n; for(int i = 1; i <= n; i++){ cin>>A[i].type; A[i].id = idx[A[i].type]; } for(int i = 1; i <= n; i++) cin>>A[i].l; for(int i = 1; i <= n; i++) cin>>A[i].r; sort(A+1,A+n+1); memset(res,255,sizeof(res)); ST.build(); for(int i = 1; i <= n; i++){ if(A[i].l>A[i].r) continue; int l = A[i].l; int r = A[i].r; int id = A[i].id; int tmp = 0; Maxi(tmp,ST.get(0,1,1,m,1,l)+1); Maxi(tmp,ST.get(1,1,1,m,1,l)+1); Maxi(tmp,ST.get(id,1,1,m,l+1,r)+1); ST.update(id,1,1,m,r,tmp); ST.add(id,1,1,m,r+1,m); } for(int i = 1; i <= m; i++){ int tmp = 0; Maxi(tmp,ST.get(0,1,1,m,i,i)); Maxi(tmp,ST.get(1,1,1,m,i,i)); Mini(res[tmp],i); } for(int i = n-1; i >= 1; i--){ if(res[i+1]==-1) continue; Mini(res[i],res[i+1]); } for(int i = 1; i <= n; i++) cout<