#include using namespace std; const int mod = 1000000000; int fact[45]; struct aint { int val; int lazy; } a[2][200005]; struct animal { char t; int s, d; int tip() { return (t == 'E' || t == 'C' ? 0 : 1); } bool operator < (const animal& rhs) const { return d < rhs.d; } } v[50005]; void push_lazy(int o, int nod) { if (a[o][nod].lazy == 0) return; a[o][2*nod].lazy += a[o][nod].lazy; a[o][2*nod].val += a[o][nod].lazy; a[o][2*nod+1].lazy += a[o][nod].lazy; a[o][2*nod+1].val += a[o][nod].lazy; a[o][nod].lazy = 0; } void upd(int o, int nod, int l, int r, int ul, int ur, int val) { if (l > r || ul > ur) return; if (ul <= l && r <= ur) { a[o][nod].val += val; a[o][nod].lazy += val; return; } push_lazy(o, nod); int mid = (l + r) / 2; if (ul <= mid) upd(o, 2*nod, l, mid, ul, ur, val); if (mid < ur) upd(o, 2*nod+1, mid+1, r, ul, ur, val); a[o][nod].val = max(a[o][2*nod].val, a[o][2*nod+1].val); } int dp[50005]; int main() { #ifdef LOCAL freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); #endif cin.tie(0); ios_base::sync_with_stdio(false); int t; cin >> t; while (t--) { int n, m; cin >> m >> n; for (int i = 1; i <= n; ++i) cin >> v[i].t; for (int i = 1; i <= n; ++i) cin >> v[i].s; for (int i = 1; i <= n; ++i) cin >> v[i].d; sort(v + 1, v + n + 1); memset(dp, 0, sizeof dp); memset(a, 0, sizeof a); int curr = 1; while (curr <= n && v[curr].d == 1) ++curr; for (int i = 2; i <= m; ++i) { while (curr <= n && v[curr].d == i) { if (v[curr].d > v[curr].s) upd(v[curr].tip(), 1, 1, m, 1, v[curr].s, 1); curr++; } dp[i] = max(a[0][1].val, a[1][1].val); upd(0, 1, 1, m, i, i, dp[i]); upd(1, 1, 1, m, i, i, dp[i]); } vector< int > ans(n + 1, 0x3f3f3f3f); for (int i = 1; i <= m; ++i) ans[dp[i]] = min(ans[dp[i]], i); for (int i = n-1; i; --i) ans[i] = min(ans[i], ans[i+1]); for (int i = 1; i <= n; ++i) cout << (ans[i] == 0x3f3f3f3f ? -1 : ans[i]) << ' '; cout << '\n'; } return 0; } //Trust me, I'm the Doctor!