#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int N = 50005; const int inf = 1000 * 1000 * 1000; const int mod = 1000 * 1000 * 1000 + 7; int t , n , m; char id[N]; int a[N] , b[N] , answ[N]; int dp[N][3]; vector g[N]; int T[4 * N][3] , D[4 * N][3]; void build(int v,int s,int e){ T[v][0] = T[v][1] = 0; D[v][0] = D[v][1] = 0; if(s == e)return ; int m = (s + e) / 2; build(2*v , s , m); build(2*v+1 , m+1 , e); } void push(int v,int s,int e){ if(D[v][0] == 0 && D[v][1] == 0)return ; T[v][0] += D[v][0]; T[v][1] += D[v][1]; if(s != e){ for(int i=0;i<2;i++){ D[2*v][i] += D[v][i]; D[2*v+1][i] += D[v][i]; } } D[v][0] = D[v][1] = 0; } void update(int v,int s,int e,int l,int r,int d,int delta){ push(v , s , e); if(l > r)return ; if(s == l && e == r){ D[v][d]++; push(v , s , e); return ; } int m = (s + e) / 2; update(2*v , s , m , l , min(r , m) , d , delta); update(2*v+1 , m+1 , e , max(m+1 , l) , r , d , delta); T[v][d] = max( T[2*v][d] , T[2*v+1][d] ); } void upd(int v,int s,int e,int pos,int delta){ push(v , s , e); if(s == e){ T[v][0] = T[v][1] = delta; return ; } int m = (s + e) / 2; if(pos <= m){ push(2*v+1 , m+1 , e); upd(2*v , s , m , pos , delta); } else{ push(2*v , s , m); upd(2*v+1 , m+1 , e , pos , delta); } T[v][0] = max(T[2*v][0] , T[2*v+1][0]); T[v][1] = max(T[2*v][1] , T[2*v+1][1]); } int get(int v,int s,int e,int l,int r,int d){ push(v , s , e); if(l > r)return 0; if(s == l && e == r)return T[v][d]; int m = (s + e) / 2; return max( get(2*v , s , m , l , min(r , m) , d) , get(2*v+1 , m+1 , e , max(m+1 , l) , r , d) ); } int main(){ scanf("%d",&t); while(t--){ scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) cin>>id[i]; for(int i=1;i<=n;i++){ answ[i] = -1; scanf("%d",&a[i]); } for(int i=1;i<=n;i++){ scanf("%d",&b[i]); if(a[i] <= b[i]) g[b[i]].push_back(i); } build(1 , 1 , m); for(int i=2;i<=m;i++){ for(int h=0;h<(int)g[i].size();h++){ int ind = g[i][h]; if(id[ind] == 'E' || id[ind] == 'C'){ update(1 , 1 , m , 1 , a[ind] , 0 , 1); } if(id[ind] == 'M' || id[ind] == 'D'){ update(1 , 1 , m , 1 , a[ind] , 1 , 1); } } for(int t=0;t<2;t++){ dp[i][t] = dp[i - 1][t]; dp[i][t] = max(dp[i][t] , get(1 , 1 , m , 1 , i - 1 , t)); } upd(1 , 1 , m , i , max(dp[i][0] , dp[i][1])); } int ind = 1; for(int i=1;i<=m;i++){ int x = max(dp[i][0] , dp[i][1]); while(ind <= x){ answ[ind] = i; ind++; } g[i].clear(); } for(int i=1;i<=n;i++) printf("%d ",answ[i]); printf("\n"); } return 0; }