#include using namespace std; int m, n; int d[50005]; vector ec[50005], dm[50005]; int u[50005], v[50005]; char tip[50005]; template struct segtree_lazy { struct updater { /* DATA MEMBERS */ int x; updater(int x = 0) : x(x) {} updater& operator+= (const updater& other) { /* ADDITION */ x += other.x; return *this; } operator bool () const { /* BOOL CAST */ return x != 0; } }; struct node_t { /* DATA MEMBERS */ int x; /* CONSTRUCTOR */ node_t(int x = 0) : x(x) {} node_t& operator+= (const node_t& other) { /* ADDITION */ x = max(x, other.x); return *this; } node_t& operator+= (const updater& other) { /* UPDATE ADDITION */ x += other.x; return *this; } node_t operator+ (const node_t& other) const { node_t tmp = *this; tmp += other; return tmp; } }; node_t a[2*MAXN]; updater b[2*MAXN]; void init() { for (int i=1; i<=MAXN; i++) { /* KOPIRAJ NEKI EKSTERNI NIZ OVDE */ a[i + MAXN - 1] = node_t(); } for (int i=MAXN-1; i>0; i--) { a[i] = a[2*i] + a[2*i+1]; } for (int i=1; i<2*MAXN; i++) { b[i] = updater(); } } void push(int i) { if (b[i]) { a[i] += b[i]; if (i < MAXN) { b[2*i] += b[i]; b[2*i+1] += b[i]; } b[i] = updater(); } } node_t get(int l, int r, int node=1, int nl=1, int nr=MAXN) { push(node); if (r < nl || nr < l) { return node_t(); } if (l <= nl && nr <= r) { return a[node]; } int nm = (nl + nr) >> 1; return get(l, r, 2*node, nl, nm) + get(l, r, 2*node+1, nm+1, nr); } void update(int l, int r, updater val, int node=1, int nl=1, int nr=MAXN) { push(node); if (r < nl || nr < l) { return; } if (l <= nl && nr <= r) { b[node] += val; push(node); return; } int nm = (nl + nr) >> 1; update(l, r, val, 2*node, nl, nm); update(l, r, val, 2*node+1, nm+1, nr); a[node] = a[2*node] + a[2*node+1]; } }; segtree_lazy<65536> drvo1, drvo2; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cerr.tie(nullptr); int t; cin >> t; while (t--) { cin >> m >> n; for (int i=1; i<=m; i++) { ec[i].clear(); dm[i].clear(); } fill(d, d+50005, 0); drvo1.init(); drvo2.init(); for (int i=1; i<=n; i++) cin >> tip[i]; for (int i=1; i<=n; i++) cin >> u[i]; for (int i=1; i<=n; i++) cin >> v[i]; for (int i=1; i<=n; i++) { if (u[i] < v[i]) { if (tip[i] == 'E' || tip[i] == 'C') { ec[v[i]].push_back(u[i]); } else { dm[v[i]].push_back(u[i]); } } } for (int i=1; i<=m; i++) { for (int x : ec[i]) { drvo1.update(1, x, 1); } for (int x : dm[i]) { drvo2.update(1, x, 1); } d[i] = max(drvo1.get(1, i).x, drvo2.get(1, i).x); // cerr << "! " << i << ' ' << d[i] << '\n'; drvo1.update(i, i, d[i]); drvo2.update(i, i, d[i]); } vector sol(n+1, 123123123); for (int i=1; i<=m; i++) { sol[d[i]] = min(sol[d[i]], i); } for (int i=n-1; i>=0; i--) { sol[i] = min(sol[i], sol[i+1]); } for (int i=1; i<=n; i++) { cout << (sol[i] == 123123123 ? -1 : sol[i]) << ' '; } cout << '\n'; } }