#include using namespace std; #define MAXN 50000 #define MAXP 132000 int aint[2][MAXP], lazy[2][MAXP], tip, poz; int dp[MAXN + 1]; vector < int > g[2][MAXN + 1]; inline void propag(int tip, int n, int st, int dr) { if (lazy[tip][n]) { aint[tip][st] += lazy[tip][n]; aint[tip][dr] += lazy[tip][n]; lazy[tip][st] += lazy[tip][n]; lazy[tip][dr] += lazy[tip][n]; lazy[tip][n] = 0; } } void update(int p, int st, int dr) { if (dr <= poz) aint[tip][p]++, lazy[tip][p]++; else { propag(tip, p, 2 * p, 2 * p + 1); int m = (st + dr) / 2; update(2 * p, st, m); if (m < poz) update(2 * p + 1, m + 1, dr); aint[tip][p] = max(aint[tip][2 * p], aint[tip][2 * p + 1]); } } void upd(int p, int st, int dr) { if (st == dr) aint[0][p] = aint[1][p] = dp[st]; else { propag(0, p, 2 * p, 2 * p + 1); propag(1, p, 2 * p, 2 * p + 1); int m = (st + dr) / 2; if (poz <= m) upd(2 * p, st, m); else upd(2 * p + 1, m + 1, dr); aint[0][p] = max(aint[0][2 * p], aint[0][2 * p + 1]); aint[1][p] = max(aint[1][2 * p], aint[1][2 * p + 1]); } } vector minimumZooNumbers(int m, int n, vector t, vector s, vector d) { // Return a list of length n consisting of the answers for (int i = 0; i < n; i++) { if (t[i] == 'E' || t[i] == 'C') { tip = 0; } else { tip = 1; } if (s[i] < d[i]) g[tip][d[i]].push_back(s[i]); } memset(aint, 0, sizeof aint); memset(lazy, 0, sizeof lazy); vector < int > ans(n); for (int i = 0; i < n; i++) ans[i] = m + 1; for (int i = 1; i <= m; i++) { tip = 0; for (auto &x : g[0][i]) { poz = x; update(1, 1, m); } g[0][i].clear(); tip = 1; for (auto &x : g[1][i]) { poz = x; update(1, 1, m); } g[1][i].clear(); dp[i] = max(dp[i - 1], max(aint[0][1], aint[1][1])); poz = i; upd(1, 1, m); if (dp[i] > 0) ans[dp[i] - 1] = min(ans[dp[i] - 1], i); } for (int i = n - 2; i >= 0; i--) ans[i] = min(ans[i], ans[i + 1]); for (int i = 0; i < n; i++) if (ans[i] == m + 1) ans[i] = -1; return ans; } int main() { int cases; cin >> cases; for(int a0 = 0; a0 < cases; a0++){ int m; int n; cin >> m >> n; vector t(n); for(int t_i = 0; t_i < n; t_i++){ cin >> t[t_i]; } vector s(n); for(int s_i = 0; s_i < n; s_i++){ cin >> s[s_i]; } vector d(n); for(int d_i = 0; d_i < n; d_i++){ cin >> d[d_i]; } vector result = minimumZooNumbers(m, n, t, s, d); for (int i = 0; i < (int)result.size(); i++) { cout << result[i] << (i != (int)result.size() - 1 ? " " : ""); } cout << endl; } return 0; }