#include #include #include #include #include bool animal_type[50005] = {}; int source[50005] = {}; int dest[50005] = {}; int oper[50005] = {}; int ans[50005] = {}; std::vector ds[2][50005] = {}; inline int maximum(int a, int b) { return (a > b ? a : b); } struct segtree { int l, r; int v; int to_add; segtree *left; segtree *right; segtree(int i, int j) { l = i; r = j; v = 0; to_add = 0; if (i == j) { left = NULL; right = NULL; } else { int k = (i+j)/2; left = new segtree(i, k); right = new segtree(k+1, j); } } void prop() { if (to_add) { v += to_add; if (left != NULL) { left->to_add += to_add; right->to_add += to_add; } to_add = 0; } } int rmq(int i, int j) { prop(); if (i <= l && r <= j) return v; else if (l > j || r < i) return 0; else return maximum(left->rmq(i, j), right->rmq(i, j)); } void upd(int i, int j, int s) { prop(); if (i <= l && r <= j) { to_add += s; prop(); } else if (l > j || r < i); else { left->upd(i, j, s); right->upd(i, j, s); v = maximum(left->v, right->v); } } }; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); int tc, m, n; char c; std::cin >> tc; while (tc--) { for (int i = 0; i < 50005; i++) { ds[0][i].clear(); ds[1][i].clear(); } std::cin >> m >> n; for (int i = 0; i < n; i++) { std::cin >> c; if (c == 'E' || c == 'C') animal_type[i] = 0; else animal_type[i] = 1; } for (int i = 0; i < n; i++) std::cin >> source[i]; for (int i = 0; i < n; i++) std::cin >> dest[i]; for (int i = 0; i < n; i++) if (source[i] < dest[i]) ds[animal_type[i]][dest[i]].push_back(source[i]); segtree *opt[2]; for (int j = 0; j < 2; j++) opt[j] = new segtree(1, m); for (int i = 1; i <= m; i++) { int u[2] = {}; for (int j = 0; j < 2; j++) { std::sort(ds[j][i].begin(), ds[j][i].end()); for (std::vector::iterator it = ds[j][i].begin(); it != ds[j][i].end(); it++) opt[j]->upd(1, *it, 1); u[j] = opt[j]->rmq(1, i-1); } oper[i] = maximum(u[0], u[1]); for (int j = 0; j < 2; j++) opt[j]->upd(i, i, maximum(u[0], u[1])); } int found = 0; for (int i = 0; i <= n; i++) ans[i] = -1; for (int i = 1; i <= m; i++) { while (oper[i] >= found) { ans[found] = i; found++; } } for (int i = 1; i <= n; i++) { if (i != 1) std::cout << ' '; std::cout << ans[i]; } std::cout << '\n'; } } /* 1 100 2 C C 1 2 3 4 */