#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const int N = 50001; int n, m, dp[N], res[N + 1]; char s[N]; pair e[N]; vector in[N][2]; int SEG[2][4 * N], LAZY[2][4 * N]; int *seg, *lazy; int at, val; void fix(int n,int s,int e){ seg[n] += lazy[n]; if (s != e) { lazy[n * 2] += lazy[n]; lazy[n * 2 + 1] += lazy[n]; } lazy[n] = 0; } void update(int n, int s, int e) { if (lazy[n]) fix(n, s, e); if (val != -1) { if (ate) return; if (s == e) { seg[n] = val; return; } } else { if (s > at) return; if (e <= at) { lazy[n] = 1; fix(n, s, e); return; } } update(n * 2, s, (s + e) / 2); update(n * 2 + 1, (s + e) / 2 + 1, e); seg[n] = max(seg[n * 2], seg[n * 2 + 1]); } int main() { int mp[128]; mp['E'] = 0; mp['D'] = 1; mp['C'] = 0; mp['M'] = 1; int t; scanf("%d", &t); while (t--) { scanf("%d%d", &m, &n); for (int i = 0; i < n; ++i) { scanf(" %c", s + i); s[i] = mp[s[i]]; } for (int i = 0; i < n; ++i) { scanf("%d", &e[i].first); --e[i].first; } for (int i = 0; i < n; ++i) { scanf("%d", &e[i].second); --e[i].second; } for (int it = 0; it < 2; ++it) { for (int j = 0; j < m; ++j) in[j][it].clear(); vector > v; for (int j = 0; j < n; ++j) if (s[j] == it && e[j].first < e[j].second) in[e[j].second][it].push_back(e[j].first); for (int j = 0; j < m; ++j) sort(in[e[j].second][it].begin(), in[e[j].second][it].end()); } memset(res, -1, sizeof(res)); memset(SEG, 0, sizeof(SEG)); memset(LAZY, 0, sizeof(LAZY)); for (int i = 0; i < m; ++i) { dp[i] = 0; for (int it = 0; it < 2; ++it) { seg = SEG[it]; lazy = LAZY[it]; for (int j = 0; j < in[i][it].size(); ++j) { val = -1; at = in[i][it][j] + 1; update(1, 1, m); } fix(1, 1, m); dp[i] = max(dp[i], seg[1]); } if (res[dp[i]] == -1) res[dp[i]] = i + 1; for (int it = 0; it < 2; ++it) { seg = SEG[it]; lazy = LAZY[it]; at = i + 1; val = dp[i]; update(1, 1, m); } } int mn = 1e9; for (int i = n; i > 0; --i) { if (res[i] != -1) mn = min(mn, res[i]); res[i] = mn; } for (int i = 1; i <= n; ++i) printf("%s%d", i == 1 ? "" : " ", res[i] == 1e9 ? -1 : res[i]); puts(""); } return 0; }