#include #define M 300000 using namespace std; struct segment_tree{ int value[4*M] , lazy[4*M]; void reset(){ memset(value , 0 , sizeof value); memset(lazy , 0 , sizeof lazy); } void inc(int k,int p,int q,int u,int v,int z){ if(p > v || u > q) return ; if(p >= u && v >= q){ value[k] += z; lazy[k] += z; return ; } inc(k*2 , p , (p + q)/2 , u , v , z); inc(k*2 + 1 , (p + q)/2 + 1 , q , u , v , z); value[k] = max(value[k*2] , value[k*2 + 1]) + lazy[k]; } }; segment_tree W,B; vector < int > w[M] , b[M]; int s[M] , d[M] , t[M] , n , m , f[M] , ans[M]; void solve(){ W.reset(); B.reset(); cin>>m>>n; for(int i = 1 ; i <= n ; i++){ string c; cin>>c; if(c == "E" || c == "C") t[i] = 0; else t[i] = 1; } for(int i = 1 ; i <= n ; i++) cin>>s[i]; for(int i = 1 ; i <= n ; i++) cin>>d[i]; for(int i = 1 ; i <= m ; i++){ w[i].clear(); b[i].clear(); } for(int i = 1 ; i <= n ; i++){ if(s[i] > d[i]) continue; if(t[i] == 0) w[d[i]].push_back(s[i]); else b[d[i]].push_back(s[i]); } for(int i = 1 ; i <= m ; i++){ for(int j = 0 ; j < w[i].size() ; j++) W.inc(1 , 1 , m , 1 , w[i][j] , 1); for(int j = 0 ; j < b[i].size() ; j++) B.inc(1 , 1 , m , 1 , b[i][j] , 1); f[i] = max(W.value[1] , B.value[1]); W.inc(1 , 1 , m , i , i , f[i]); B.inc(1 , 1 , m , i , i , f[i]); } for(int i = 1 ; i <= n ; i++) ans[i] = m + 1; for(int i = 1 ; i <= m ; i++) ans[f[i]] = min(ans[f[i]] , i); for(int i = n - 1 ; i >= 1 ; i--) ans[i] = min(ans[i] , ans[i + 1]); for(int i = 1 ; i <= n ; i++) printf("%d ",(ans[i] <= m ? ans[i] : -1)); printf("\n"); } int main(){ //freopen("input.txt","r",stdin); int Tc; scanf("%d",&Tc); for(int i = 1 ; i <= Tc ; i++) solve(); }