#include using namespace std; using pii = pair; struct RMQ { using type = int; static type id() { return 0; } static type op(const type& l, const type & r) { return max(l, r); } }; template class StarrySkyTree { using T = typename M::type; const int n; vector data, data2; int size(int n) { int res = 1; while (res < n) res <<= 1; return res; } T sub(int l, int r, int node, int lb, int ub) { if (ub <= l || r <= lb) return M::id(); if (l <= lb && ub <= r) return data[node] + data2[node]; return M::op(sub(l, r, node * 2, lb, (lb + ub) / 2), sub(l, r, node * 2 + 1, (lb + ub) / 2, ub)) + data2[node]; } void suc(int l, int r, int node, int lb, int ub, T val) { if (ub <= l || r <= lb) return; if (l <= lb && ub <= r) { data2[node] += val; return; } int left = node * 2, right = node * 2 + 1; suc(l, r, left, lb, (lb + ub) / 2, val); suc(l, r, right, (lb + ub) / 2, ub, val); data[node] = M::op(data[left] + data2[left], data[right] + data2[right]); } public: StarrySkyTree(int n_) : n(size(n_)), data(n * 2, 0), data2(n * 2, 0) {} void add(int l, int r, T val) { suc(l, r + 1, 1, 0, n, val); } T find(int l, int r) { return sub(l, r + 1, 1, 0, n); } }; int main() { int t; cin >> t; while (t--) { int m, n; cin >> m >> n; vector t(n); vector s(n), d(n); for (int i = 0; i < n; i++) { cin >> t[i]; } for (int i = 0; i < n; i++) { cin >> s[i]; s[i]--; } for (int i = 0; i < n; i++) { cin >> d[i]; d[i]--; } vector> ec(m), dm(m); for (int i = 0; i < n; i++) { if (s[i] >= d[i]) continue; if (t[i] == 'E' || t[i] == 'C') { ec[d[i]].push_back(s[i]); } else { dm[d[i]].push_back(s[i]); } } StarrySkyTree dp1(m + 1), dp2(m + 1); vector dp(m + 1); for (int i = 0; i < m; i++) { int val = 0; { for (auto to : ec[i]) { dp1.add(0, to + 1, 1); } val = max(val, dp1.find(0, i)); } { for (auto to : dm[i]) { dp2.add(0, to + 1, 1); } val = max(val, dp2.find(0, i)); } dp[i + 1] = val; dp1.add(i + 1, i + 1, val); dp2.add(i + 1, i + 1, val); } vector res(n, -1); for (int i = 0; i < m; i++) { auto v = dp[i + 1]; if (v == 0) continue; assert(v <= n); if (res[v - 1] == -1) res[v - 1] = i + 1; } for (int i = n - 2; i >= 0; i--) { if (res[i + 1] != -1 && res[i] == -1) res[i] = res[i + 1]; } for (int i = 0; i < n; i++) { printf("%d%c", res[i], " \n"[i + 1 == n]); } } return 0; }