#include using namespace std; const int inf = 1e9; #define trav(a, x) for(auto& a : x) typedef vector vi; struct Node { Node *l = 0, *r = 0; int lo, hi, mset = inf, madd = 0, val = -inf; Node(int lo,int hi):lo(lo),hi(hi){} // Large interval of -inf Node(vi& v, int lo, int hi) : lo(lo), hi(hi) { if (lo + 1 < hi) { int mid = lo + (hi - lo)/2; l = new Node(v, lo, mid); r = new Node(v, mid, hi); val = max(l->val, r->val); } else val = v[lo]; } int query(int L, int R) { if (R <= lo || hi <= L) return -inf; if (L <= lo && hi <= R) return val; push(); return max(l->query(L, R), r->query(L, R)); } void set(int L, int R, int x) { if (R <= lo || hi <= L) return; if (L <= lo && hi <= R) mset = val = x, madd = 0; else { push(), l->set(L, R, x), r->set(L, R, x); val = max(l->val, r->val); } } void add(int L, int R, int x) { if (R <= lo || hi <= L) return; if (L <= lo && hi <= R) { if (mset != inf) mset += x; else madd += x; val += x; } else { push(), l->add(L, R, x), r->add(L, R, x); val = max(l->val, r->val); } } void push() { if (!l) { int mid = lo + (hi - lo)/2; l = new Node(lo, mid); r = new Node(mid, hi); } if (mset != inf) l->set(lo,hi,mset), r->set(lo,hi,mset), mset = inf; else if (madd) l->add(lo,hi,madd), r->add(lo,hi,madd), madd = 0; } }; vi dp((int) 1e5); Node* tra = new Node(dp,0,(int) 1e5); Node* trb = new Node(dp,0,(int) 1e5); vector minimumZooNumbers(int m, int n, vector t, vector s, vector d) { // Return a list of length n consisting of the answers vector zoosA[m+1]; vector zoosB[m+1]; tra->set(0,m+5,0); trb->set(0,m+5,0); dp.clear(); for(int i = 0 ; i < n; i++){ if(s[i] > d[i])continue; if(t[i] == 'E' || t[i] == 'C'){ zoosA[d[i]].push_back(s[i]); }else{ zoosB[d[i]].push_back(s[i]); } } for(int i = 1; i <= m; i++){ trav(it, zoosA[i])tra->add(0,it,1); trav(it, zoosB[i])trb->add(0,it,1); dp[i] = max(tra->query(0,i),trb->query(0,i)); tra->add(i-1,i,dp[i]); trb->add(i-1,i,dp[i]); } vector ans(n); ans.assign(n,-1); for(int i = 1; i <= m; i++){ if(dp[i] > 0 && ans[dp[i]-1] == -1)ans[dp[i]-1] = i; } for(int i = n-1; i > 0; i--){ if(ans[i-1] == -1)ans[i-1] = ans[i]; } return ans; } int main() { int cases; cin >> cases; for(int a0 = 0; a0 < cases; a0++){ int m; int n; cin >> m >> n; vector t(n); for(int t_i = 0; t_i < n; t_i++){ cin >> t[t_i]; } vector s(n); for(int s_i = 0; s_i < n; s_i++){ cin >> s[s_i]; } vector d(n); for(int d_i = 0; d_i < n; d_i++){ cin >> d[d_i]; } vector result = minimumZooNumbers(m, n, t, s, d); for (ssize_t i = 0; i < result.size(); i++) { cout << result[i] << (i != result.size() - 1 ? " " : ""); } cout << endl; } return 0; }