#include using namespace std; typedef pair ii; typedef pair iii; const string let = "EDCM"; const int Maxn = 50005; const int Maxm = 262144; int t; int m, n; int typ[Maxn]; int s[Maxn], d[Maxn]; iii seq[Maxn]; int st[2][Maxm], fl[2][Maxm]; int res[Maxn], ires[Maxn]; void downOn(int s, int v, int f) { st[s][v] += f; fl[s][v] += f; } void Down(int s, int v) { if (fl[s][v]) { downOn(s, 2 * v, fl[s][v]); downOn(s, 2 * v + 1, fl[s][v]); fl[s][v] = 0; } } void Union(int s, int v) { st[s][v] = max(st[s][2 * v], st[s][2 * v + 1]); } void Clear(int s, int v, int l, int r) { st[s][v] = fl[s][v] = 0; if (l < r) { int m = l + r >> 1; Clear(s, 2 * v, l, m); Clear(s, 2 * v + 1, m + 1, r); } } void Update(int s, int v, int l, int r, int a, int b) { if (l == a && r == b) downOn(s, v, 1); else { Down(s, v); int m = l + r >> 1; if (a <= m) Update(s, 2 * v, l, m, a, min(m, b)); if (m + 1 <= b) Update(s, 2 * v + 1, m + 1, r, max(m + 1, a), b); Union(s, v); } } void Change(int s, int v, int l, int r, int x, int val) { if (l == r) st[s][v] = max(st[s][v], val); else { Down(s, v); int m = l + r >> 1; if (x <= m) Change(s, 2 * v, l, m, x, val); else Change(s, 2 * v + 1, m + 1, r, x, val); Union(s, v); } } int Get(int s, int v, int l, int r, int a, int b) { if (l == a && r == b) return st[s][v]; else { Down(s, v); int m = l + r >> 1; if (b <= m) return Get(s, 2 * v, l, m, a, b); if (m + 1 <= a) return Get(s, 2 * v + 1, m + 1, r, a, b); return max(Get(s, 2 * v, l, m, a, m), Get(s, 2 * v + 1, m + 1, r, m + 1, b)); } } int main() { scanf("%d", &t); while (t--) { scanf("%d %d", &m, &n); for (int i = 0; i < n; i++) { char ch; scanf(" %c", &ch); typ[i] = let.find(ch) % 2; } for (int i = 0; i < n; i++) scanf("%d", &s[i]); for (int i = 0; i < n; i++) scanf("%d", &d[i]); for (int i = 0; i < n; i++) seq[i] = iii(d[i], ii(s[i], typ[i])); sort(seq, seq + n); Clear(0, 1, 1, m); Clear(1, 1, 1, m); fill(res, res + m + 1, 0); for (int i = 0; i < n; i++) { int D = seq[i].first, S = seq[i].second.first; int ind = seq[i].second.second; if (S <= D) { Update(ind, 1, 1, m, 1, S); int got = Get(ind, 1, 1, m, 1, S); res[D] = max(res[D], got); Change(1 - ind, 1, 1, m, D, got); } } for (int i = 1; i <= n; i++) ires[i] = Maxn; for (int i = 1; i <= m; i++) ires[res[i]] = min(ires[res[i]], i); for (int i = n - 1; i >= 1; i--) ires[i] = min(ires[i], ires[i + 1]); for (int i = 1; i <= n; i++) printf("%d%c", (ires[i] >= Maxn? -1: ires[i]), (i + 1 <= n? ' ': '\n')); } return 0; }