#include using namespace std; typedef long long ll; const int MAXN = 50005; const int MAXSEG = 1<<17; int N, M; char D[MAXN]; int S[MAXN]; int T[MAXN]; vector A[MAXN][2]; int dp[MAXN][2]; int seg[MAXSEG][2]; int lazy[MAXSEG][2]; int ans[MAXN]; void down(int node, int type) { if (lazy[node][type] != 0) { seg[2*node][type] += lazy[node][type]; seg[2*node + 1][type] += lazy[node][type]; lazy[2*node][type] += lazy[node][type]; lazy[2*node + 1][type] += lazy[node][type]; lazy[node][type] = 0; } } void update_range(int node, int left, int right, int ql, int qr, int type) { if (left > right || ql > qr || qr < left || right < ql) return; if (ql <= left && right <= qr) { seg[node][type]++; lazy[node][type]++; return; } down(node, type); int mid = (left + right)/2; update_range(2*node, left, mid, ql, qr, type); update_range(2*node + 1, mid + 1, right, ql, qr, type); seg[node][type] = max(seg[2*node][type], seg[2*node + 1][type]); } void update(int node, int left, int right, int idx, int val, int type) { if (left == idx && idx == right) { seg[node][type] = val; return; } down(node, type); int mid = (left + right)/2; if (idx <= mid) update(2*node, left, mid, idx, val, type); else update(2*node + 1, mid + 1, right, idx, val, type); seg[node][type] = max(seg[2*node][type], seg[2*node + 1][type]); } int query(int node, int left, int right, int ql, int qr, int type) { if (left > right || ql > qr || qr < left || right < ql) return 0; if (ql <= left && right <= qr) return seg[node][type]; down(node, type); int mid = (left + right)/2; return max(query(2*node, left, mid, ql, qr, type), query(2*node + 1, mid + 1, right, ql, qr, type)); } void go() { for (int i = 1; i <= N; i++) { int type = D[i] == 'E' || D[i] == 'C'; if (S[i] <= T[i]) A[T[i]][type].push_back(S[i]); } for (int i = 1; i <= M; i++) for (int j = 0; j < 2; j++) { if (A[i][j].empty()) continue; int left = 0; for (int k = 0; k < A[i][j].size(); k++) { left = max(left, A[i][j][k]); update_range(1, 1, M, 1, A[i][j][k], j ^ 1); } dp[i][j] = query(1, 1, M, 1, left, j ^ 1); //cout << "dp[" << i << "][" << j << "] = " << dp[i][j] << "\n"; update(1, 1, M, i, dp[i][j], j); } for (int i = 1; i <= N; i++) ans[i] = M + 1; for (int i = 1; i <= M; i++) { ans[dp[i][0]] = min(ans[dp[i][0]], i); ans[dp[i][1]] = min(ans[dp[i][1]], i); } for (int i = N - 1; i >= 1; i--) ans[i] = min(ans[i], ans[i + 1]); for (int i = 1; i <= N; i++) if (ans[i] == M + 1) ans[i] = -1; } int main() { ios::sync_with_stdio(0); int cases; cin >> cases; for(int a0 = 0; a0 < cases; a0++) { cin >> M >> N; for (int i = 1; i <= M; i++) { A[i][0].clear(); A[i][1].clear(); } for (int i = 1; i <= N; i++) cin >> D[i]; for (int i = 1; i <= N; i++) cin >> S[i]; for (int i = 1; i <= N; i++) cin >> T[i]; memset(dp, 0, sizeof(dp)); memset(seg, 0, sizeof(seg)); memset(lazy, 0, sizeof(lazy)); go(); for (int i = 1; i <= N; i++) cout << ans[i] << " "; cout << "\n"; } return 0; }