#include #define rep(i, a, b) for (int i = (a); i <= (b); ++i) #define per(i, a, b) for (int i = (a); i >= (b); --i) #define pb push_back #define mp make_pair #define pr pair #define x first #define y second using namespace std; template void read(T& n){ char ch; int sign = 1; while (!isdigit(ch = getchar())) if (ch == '-') sign = -1; n = ch - '0'; while (isdigit(ch = getchar())) n = n * 10 + ch - '0'; n *= sign; } typedef long long ll; const int INF = 1e9 + 7; const int N = 51111; int f[N]; vector a, b; struct Seg_tr{ struct node{int lc, rc, mx, tag;} tr[N*4]; int n, tt; #define mid ((l + r) >> 1) void clear(int x){n = x, tt = 1, build(1, 1, n);} void build(int x, int l, int r){ tr[x].mx = tr[x].tag = tr[x].lc = tr[x].rc = 0; if (l != r){ tr[x].lc = ++tt, build(tt, l, mid); tr[x].rc = ++tt, build(tt, mid + 1, r); } } void pushdown(int x){ if (!tr[x].tag) return ; tr[x].mx += tr[x].tag; if (tr[x].lc) tr[tr[x].lc].tag += tr[x].tag; if (tr[x].rc) tr[tr[x].rc].tag += tr[x].tag; tr[x].tag = 0; } void update(int x){ pushdown(x), pushdown(tr[x].lc), pushdown(tr[x].rc); tr[x].mx = max(tr[tr[x].lc].mx, tr[tr[x].rc].mx); } void modify(int x, int l, int r, int nl, int nr, int k){ pushdown(x); if (nl <= l&&r <= nr){tr[x].tag += k; return ;} if (nl <= mid) modify(tr[x].lc, l, mid, nl, nr, k); if (mid < nr) modify(tr[x].rc, mid + 1, r, nl, nr, k); update(x); } int query(int x, int l, int r, int nl, int nr){ pushdown(x); if (nl <= l&&r <= nr) return tr[x].mx; int ans = 0; if (nl <= mid) ans = max(ans, query(tr[x].lc, l, mid, nl, nr)); if (mid < nr) ans = max(ans, query(tr[x].rc, mid + 1, r, nl, nr)); return ans; } void modify(int l, int r, int k){modify(1, 1, n, l, r, k);} int query(int l, int r){return query(1, 1, n, l, r);} #undef mid } ta, tb; vector minimumZooNumbers(int m, int n, vector t, vector s, vector d) { // Return a list of length n consisting of the answers a.clear(), b.clear(); ta.clear(m), tb.clear(m); rep(i, 0, n - 1){ if (s[i] >= d[i]) continue; if (t[i] == 'E'||t[i] == 'C') a.pb(mp(d[i], s[i])); else b.pb(mp(d[i], s[i])); } sort(a.begin(), a.end()), sort(b.begin(), b.end()); memset(f, 0, sizeof(f)); int j = 0, k = 0; rep(i, 2, m){ for (; j < a.size()&&a[j].x <= i; ++j) ta.modify(1, a[j].y, 1); for (; k < b.size()&&b[k].x <= i; ++k) tb.modify(1, b[k].y, 1); f[i] = max(f[i-1], max(ta.query(1, i - 1), tb.query(1, i - 1))); assert(ta.query(i, i) == 0&&tb.query(i, i) == 0); ta.modify(i, i, f[i]), tb.modify(i, i, f[i]); } // rep(i, 1, m) cerr << f[i] << ' '; cerr << endl; vector ans(n); rep(i, 1, n){ int p = lower_bound(f + 1, f + m + 1, i) - f; ans[i-1] = f[p] >= i ? p : -1; } 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; }