#include #define FOR(x, a, b) for (int x = a; x <= b; ++x) #define FOD(x, a, b) for (int x = a; x >= b; --x) #define REP(x, a, b) for (int x = a; x < b; ++x) #define DEBUG(X) { cout << #X << " = " << X << endl; } #define PR(A, n) { cout << #A << " = "; FOR(_, 1, n) cout << A[_] << " "; cout << endl; } #define PR0(A, n) { cout << #A << " = "; REP(_, 0, n) cout << A[_] << " "; cout << endl; } using namespace std; typedef long long LL; typedef pair II; const int N = 5e4 + 10; const int INF = 0x3f3f3f3f; int n, m; int s[N], d[N], f[N]; char t[N]; vector adj[2][N]; struct SegmentTree { #define m ((l + r) >> 1) int st[4 * N], lp[4 * N]; void Build(int k, int l, int r) { st[k] = lp[k] = 0; if (l == r) return; Build(k << 1, l, m); Build(k << 1 | 1, m + 1, r); } void Propagate(int k) { if (lp[k] == 0) return; int v = lp[k]; lp[k] = 0; lp[k << 1] += v; lp[k << 1 | 1] += v; st[k << 1] += v; st[k << 1 | 1] += v; } void Update(int k, int l, int r, int i, int j, int v) { if (l > j || r < i) return; if (i <= l && r <= j) { st[k] += v; lp[k] += v; return; } Propagate(k); Update(k << 1, l, m, i, j, v); Update(k << 1 | 1, m + 1, r, i, j, v); st[k] = max(st[k << 1], st[k << 1 | 1]); } void Assign(int k, int l, int r, int i, int v) { if (l == r) { st[k] = v; return; } Propagate(k); if (i <= m) Assign(k << 1, l, m, i, v); else Assign(k << 1 | 1, m + 1, r, i, v); st[k] = max(st[k << 1], st[k << 1 | 1]); } #undef m } ST[2]; void Init() { memset(f, 0, sizeof f); FOR(k, 0, 1) FOR(i, 1, m) adj[k][i].clear(); } void Prepare() { FOR(i, 1, n) { if (s[i] > d[i]) continue; int k = (t[i] == 'D' || t[i] == 'M') ? 0 : 1; adj[k][d[i]].push_back(s[i]); } } void Solve() { FOR(k, 0, 1) ST[k].Build(1, 1, m); FOR(x, 1, m) if (adj[0][x].size() + adj[1][x].size() > 0) { FOR(k, 0, 1) { REP(i, 0, adj[k][x].size()) { int p = adj[k][x][i]; ST[k].Update(1, 1, m, 1, p, +1); } } FOR(k, 0, 1) f[x] = max(f[x], ST[k].st[1]); FOR(k, 0, 1) ST[k].Assign(1, 1, m, x, f[x]); } FOR(i, 1, m) if (f[i] == 0) f[i] = f[i - 1]; FOR(i, 1, n) { int l = 1, r = m, res = -1; while (l <= r) { int m = (l + r) >> 1; if (f[m] >= i) { res = m; r = m - 1; } else l = m + 1; } printf("%d ", res); } putchar('\n'); } int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif // LOCAL int TC; scanf("%d", &TC); while (TC--) { scanf("%d%d", &m, &n); Init(); FOR(i, 1, n) { char S[2]; scanf("%s", S); t[i] = S[0]; } FOR(i, 1, n) scanf("%d", &s[i]); FOR(i, 1, n) scanf("%d", &d[i]); Prepare(); Solve(); } return 0; }