#include using namespace std; const int maxn = 100002; int m, n, type[maxn], s[maxn], f[maxn][2]; vector > p[maxn]; struct segmentTree { pair st[maxn*4]; void reset() { for (int i=1; i<=4*m; ++i) st[i] = make_pair(0, 0); } void down(int id) { int tmp = st[id].second; st[id].second = 0; st[id*2].first += tmp; st[id*2].second += tmp; st[id*2+1].first += tmp; st[id*2+1].second += tmp; } void update(int u, int v, int val, int l=1, int r=m, int id=1) { if (v=v) r = mid; else l = mid; mid = (l+r)/2; } for (int i=l; i<=r; ++i) { if (max(f[i][0], f[i][1])>=v) return i; } return -1; } void solve() { cin >> m >> n; reset(); for (int i=1; i<=n; ++i) { char c; cin >> c; if (c=='E' || c=='C') type[i] = 0; else type[i] = 1; } for (int i=1; i<=n; ++i) cin >> s[i]; for (int i=1; i<=n; ++i) { int x; cin >> x; p[x].push_back(make_pair(type[i], s[i])); } for (int i=1; i<=m; ++i) { for (int j=0; j<(int)p[i].size(); ++j) { if (p[i][j].second>i) continue; st[p[i][j].first^1].update(1, p[i][j].second, 1); } f[i][0] = st[1].get(1, i); f[i][1] = st[0].get(1, i); st[0].update(i, i, f[i][0]); st[1].update(i, i, f[i][1]); } for (int i=1; i<=n; ++i) { cout << bisect(i) << ' '; } cout << '\n'; } int main() { //freopen("zoos.inp", "r", stdin); //freopen("zoos.out", "w", stdout); ios::sync_with_stdio(0); cin.tie(0); int nTest; cin >> nTest; while (nTest--) { solve(); } }