#include using namespace std; const int MAXN = 50010; const int OFFSET = 4 * MAXN; struct segtree{ #define mid (left + right) / 2 #define prop propagate(idx, left, right) int st[OFFSET], lazy[OFFSET]; int n; segtree(int _n){ n = _n; for(int i = 0; i < OFFSET; i++) st[i] = lazy[i] = 0; } void propagate(int idx, int left, int right){ if(!lazy[idx]) return; st[idx] += lazy[idx]; if(left != right){ lazy[2 * idx] += lazy[idx]; lazy[2 * idx + 1] += lazy[idx]; } lazy[idx] = 0; } void update(int idx, int left, int right, int l, int r, int val){ prop; if(l <= left && right <= r){ lazy[idx] += val; prop; return; } if(l <= mid) update(2 * idx, left, mid, l, r, val); if(r > mid) update(2 * idx + 1, mid + 1, right, l, r, val); propagate(2 * idx, left, mid); propagate(2 * idx + 1, mid + 1, right); st[idx] = max(st[2 * idx], st[2 * idx + 1]); } int query(int idx, int left, int right, int l, int r){ prop; if(l <= left && right <= r) return st[idx]; if(r < left || l > right) return 0; return max(query(2 * idx, left, mid, l, r), query(2 * idx + 1, mid + 1, right, l, r)); } int query_global(int l, int r){ if(l > r) return 0; return query(1, 1, n, l, r); } void update_global(int l, int r, int val){ update(1, 1, n, l, r, val); } }; vector where[2][MAXN]; int te[MAXN], s[MAXN], e[MAXN]; int dp[MAXN]; int ans[MAXN]; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t; cin >> t; while(t--){ for(int i = 0; i < MAXN; i++) { where[0][i].clear(); where[1][i].clear(); } int m, n; cin >> m >> n; for(int i = 1; i <= n; i++){ char c; cin >> c; if(c == 'E' || c == 'C') te[i] = 1; else te[i] = 0; } for(int i = 1; i <= n; i++) cin >> s[i]; for(int i = 1; i <= n; i++) cin >> e[i]; for(int i = 1; i <= n; i++){ if(e[i] < s[i]) continue; where[te[i]][e[i]].push_back(s[i]); } segtree t1 = segtree(m); segtree t2 = segtree(m); for(int x = 1; x <= m; x++){ for(auto y : where[0][x]) t1.update_global(1, y, 1); for(auto y : where[1][x]) t2.update_global(1, y, 1); dp[x] = max(t1.query_global(1, x - 1), t2.query_global(1, x - 1)); t1.update_global(x, x, dp[x]); t2.update_global(x, x, dp[x]); } /*for(int i = 1; i <= m; i++) cout << dp[i] << " "; cout << endl;*/ for(int i = 1; i <= n; i++) ans[i] = -1; for(int i = 1; i <= m; i++) { //Exists i such that dp[i] > n //if(dp[i] > n) continue; if(ans[dp[i]] == -1) ans[dp[i]] = i; } for(int i = n - 1; i >= 1; i--) { if(ans[i] == -1) ans[i] = ans[i + 1]; else if(ans[i] > ans[i + 1] && ans[i + 1] != -1) ans[i] = ans[i + 1]; } for(int i = 1; i <= n; i++) cout << ans[i] << " "; cout << endl; } }