/*** 2 10 3 E D C 4 1 4 7 5 8 10 6 E D C M E D 1 1 1 2 9 7 2 2 2 4 10 10 ***/ #include using namespace std; typedef long long ll; struct Fen { ll A[100009]; Fen() { fill_n(A, 100009, 0); } void add(ll i, ll k) { for (; i < 100009; i += (i) & (-i)) A[i] += k; } ll get(ll i) { ll ret = 0; for (; i > 0; i -= (i) & (-i)) ret += A[i]; return ret; } ll get(ll l, ll r) { return get(r) - get(l - 1); } }; struct rmq { int l, r; int mx = 0; int lazy = 0; rmq *left, *right; rmq() { } rmq(int l, int r): l(l), r(r) { if (l < r) { left = new rmq(l, (l + r) / 2); right = new rmq((l + r) / 2 + 1, r); } } void fix() { mx += lazy; if (l < r) { left->lazy += lazy; right->lazy += lazy; } lazy = 0; } void add(int a, int b, int k) { if (a <= l && r <= b) { lazy += k; fix(); return; } fix(); if (r < a || b < l) return; left->add(a, b, k); right->add(a, b, k); mx = max(left->mx, right->mx); } int get(int a, int b) { if (a <= l && r <= b) { fix(); return mx; } fix(); if (r < a || b < l) return 0; return max(left->get(a, b), right->get(a, b)); } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t; cin >> t; while (t--) { int m, n; cin >> m >> n; char t[n]; int s[n]; int d[n]; for (int i = 0; i < n; i++) cin >> t[i]; for (int i = 0; i < n; i++) cin >> s[i]; for (int i = 0; i < n; i++) cin >> d[i]; vectorA[2][m + 1]; Fen Kerta[2]; ll X[2][m + 1]; ll D[m + 1]; rmq Y[2]; Y[0] = rmq(0, m + 2); Y[1] = rmq(0, m + 2); for (int i = 0; i < n; i++) if (s[i] <= d[i]) A[(t[i] == 'M') || (t[i] == 'D')][d[i]].push_back(s[i]); for (int i = 0; i <= m; i++) for (int t = 0; t < 2; t++) { D[i] = 0; X[t][i] = 0; sort(A[t][i].begin(), A[t][i].end(), [](int a, int b) {return a > b;}); } for (int i = 0; i < n; i++) { if (s[i] < d[i]) { X[(t[i] == 'M') || (t[i] == 'D')][d[i]]++; } } for (int i = 1; i <= m; i++) for (int t = 0; t < 2; t++) { X[t][i] += X[t][i - 1]; } for (int i = 1; i <= m; i++) { for (int t = 0; t < 2; t++) for (int j : A[t][i]) { Y[t].add(j + 1, m + 2, -1); Kerta[t].add(j, 1); } D[i] = max(D[i], D[i - 1]); for (int t = 0; t < 2; t++) D[i] = max(D[i], Y[t].get(0, i - 1) + X[t][i]);/* for (int t = 0; t < 2; t++) for (int j = 0; j < i; j++) D[i] = max(D[i], D[j] + X[t][i] - Kerta[t].get(0, j - 1));*/ Y[0].add(i, i, D[i]); Y[1].add(i, i, D[i]); } int R[n + 1]; fill_n(R, n + 1, m + 2); for (int i = 0; i <= m; i++) R[D[i]] = min(R[D[i]], i); for (int i = n - 1; i >= 1; i--) R[i] = min(R[i], R[i + 1]); for (int i = 1; i <= n; i++) cout << ((R[i] <= m) ? R[i] : -1) << " "; cout << "\n"; } }