#include using namespace std; typedef long long ll; const int N = 5e4+5; struct Animal{ int l,r,t; bool operator<(const Animal &t)const{ return r < t.r; } }; struct Seg{ int val,lazy; Seg *lc,*rc; int L,R,M; Seg(int l, int r):L(l),R(r){ M = (L+R)/2; lc = rc = NULL; lazy = val = 0; if(l < r){ lc = new Seg(L,M); rc = new Seg(M+1,R); } } void lazy_down(){ if(lc != NULL){ lc->val += lazy; lc->lazy += lazy; rc->val += lazy; rc->lazy += lazy; } lazy = 0; } void upd(){ lazy_down(); val = max(lc->val,rc->val); } void add(int l, int r){ lazy_down(); if(l <= L && R <= r){ lazy += 1; val += 1; return; } if(l <= M) lc->add(l,r); if(r > M) rc->add(l,r); upd(); } int get(int l, int r){ //cout << "get: " << l << ' ' << r << '\n'; lazy_down(); if(l <= L && R <= r) return val; int ans = 0; if(l <= M) ans = max(ans,lc->get(l,r)); if(r > M) ans = max(ans,rc->get(l,r)); return ans; } void set(int pos, int x){ lazy_down(); if(L == R){ val = max(val,x); return; } if(pos <= M) lc->set(pos,x); else rc->set(pos,x); upd(); } }; void solve(){ int m,n; cin >> m >> n; //cout << m << ' ' << n << '\n'; vector animals(n); for(int i = 0; i < n; ++i){ char c; scanf(" %c",&c); if(c == 'E' || c == 'C') animals[i].t = 0; else animals[i].t = 1; } for(int i = 0; i < n; ++i) scanf("%d",&animals[i].l); vector real_animals; for(int i = 0; i < n; ++i){ scanf("%d",&animals[i].r); //assert(animals[i].r >= animals[i].l); if(animals[i].r >= animals[i].l) real_animals.push_back(animals[i]); //cout << animals[i].l << ' ' << animals[i].r << '\n'; } animals = real_animals; sort(animals.begin(),animals.end()); Seg stree[2] = {Seg(0,m),Seg(0,m)}; vector ans(n+1,-1); for(auto cur : animals){ int best = stree[cur.t^1].get(0,cur.l) + 1; if(ans[best] == -1) ans[best] = cur.r; stree[cur.t^1].add(0,cur.l); stree[cur.t].set(cur.r,best); } for(int i = 1; i <= n; ++i) printf("%d%c",ans[i]," \n"[i==n]); } int main(){ int t; cin >> t; while(t--) solve(); }