/*input 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; struct node { node *left = NULL, *right = NULL; int from, to; long long val = 0, lazy = 0; node(int from, int to): from(from), to(to) { if (from == to) return; left = new node(from, (from + to) / 2); right = new node((from + to) / 2 + 1, to); } void fix() { val += lazy; if (from != to) { left->lazy += lazy; right->lazy += lazy; } lazy = 0; } long long get(int fr, int t) { fix(); if (fr <= from and to <= t) return val; if (t < from or to < fr) return 0; return max(left->get(fr, t), right->get(fr, t)); } void update(int fr, int t, long long delta) { fix(); if (t < from or to < fr) return; if (fr <= from and to <= t) { lazy += delta; fix(); } else { left->update(fr, t, delta); right->update(fr, t, delta); val = max(left->val, right->val); } } ~node() { if (left) { delete left; delete right; } } }; struct Gyvun { int s, d; bool t; }; int main () { int t; cin >> t; while (t--) { int m, n; cin >> m >> n; Gyvun gyv[n]; for (int i = 0; i < n; i++) { char x; cin >> x; gyv[i].t = x == 'E' or x == 'C'; } for (int i = 0; i < n; i++) cin >> gyv[i].s; for (int i = 0; i < n; i++) cin >> gyv[i].d; vector gyvun; for (int i = 0; i < n; i++) { if (gyv[i].s < gyv[i].d) gyvun.push_back(gyv[i]); } sort(gyvun.begin(), gyvun.end(), [](const auto & i, const auto & j) -> bool { if (i.d == j.d) return i.s < j.s; return i.d < j.d; }); node *medisa = new node(0, m); node *medisb = new node(0, m); int kiek[m + 1] = {}; for (auto && g : gyvun) { if (g.t) { int tempats = 0; medisa->update(0, g.s, 1); tempats = medisa->get(0, g.s); kiek[g.d] = max(kiek[g.d], tempats); medisa->update(g.d, m, kiek[g.d] - medisa->get(g.d, g.d)); medisb->update(g.d, m, kiek[g.d] - medisb->get(g.d, g.d)); } else { int tempats = 0; medisb->update(0, g.s, 1); tempats = medisb->get(0, g.s); kiek[g.d] = max(kiek[g.d], tempats); medisa->update(g.d, m, kiek[g.d] - medisa->get(g.d, g.d)); medisb->update(g.d, m, kiek[g.d] - medisb->get(g.d, g.d)); } /* for (int i = 0; i <= m; i++) cout << medisa->get(i, i) << " "; cout << endl; for (int i = 0; i <= m; i++) cout << medisb->get(i, i) << " "; cout << endl; cout << endl;*/ } /*for (int i = 0; i <= m; i++) { if (i > 0) kiek[i] = max(kiek[i], kiek[i - 1]); cout << kiek[i] << " "; } cout << endl;*/ int ats[n + 1]; for (int i = 0; i <= n; i++) ats[i] = -1; int p = 0; for (int i = 0; i <= m; i++) { if (i > 0) kiek[i] = max(kiek[i], kiek[i - 1]); while (p <= kiek[i]) ats[p++] = i; } for (int i = 1; i <= n; i++) cout << ats[i] << " "; cout << "\n"; delete medisa; delete medisb; } return 0; }