#include #define mp make_pair #define pb push_back #define f first #define s second #define ll long long using namespace std; const int N = (5e4 + 100), mod = (1e9) + 7; char t[N]; int s[N], d[N], a[N], b[N]; int deoec[4 * N], deodm[4 * N], aec[4 * N], adm[4 * N]; vector ec[N], dm[N]; void build(int (&deo)[4 * N], int (&a)[4 * N], int v, int tl, int tr) { if(tl == tr) { deo[v] = 0; a[v] = 0; return; } int tm = (tl + tr) >> 1; build(deo, a, v * 2 + 1, tl, tm); build(deo, a, v * 2 + 2, tm + 1, tr); a[v] = 0; deo[v] = max(deo[v * 2 + 1], deo[v * 2 + 2]) + a[v]; } void add(int (&deo)[4 * N], int (&a)[4 * N], int l, int r, int val, int v, int tl, int tr) { if(tr < l || r < tl) { return; } if(l <= tl && tr <= r) { deo[v] += val; a[v] += val; return; } int tm = (tl + tr) >> 1; add(deo, a, l, r, val, v * 2 + 1, tl, tm); add(deo, a, l, r, val, v * 2 + 2, tm + 1, tr); deo[v] = max(deo[v * 2 + 1], deo[v * 2 + 2]) + a[v]; } int get(int (&deo)[4 * N], int (&a)[4 * N], int l, int r, int v, int tl, int tr) { if(tr < l || r < tl) { return 0; } if(l <= tl && tr <= r) { return deo[v]; } int tm = (tl + tr) >> 1; return max(get(deo, a, l, r, v * 2 + 1, tl, tm), get(deo, a, l, r, v * 2 + 2, tm + 1, tr)) + a[v]; } int main(){ int te; scanf("%d", &te); for(; te--; ) { int n, m; scanf("%d%d", &n, &m); for(int i = 0; i < m; i++) { scanf(" %c", &t[i]); } for(int i = 0; i < m; i++) { scanf(" %d", &s[i]); } for(int i = 0; i < m; i++) { scanf(" %d", &d[i]); } for(int i = 0; i <= n; i++) { ec[i].clear(); dm[i].clear(); } for(int i = 0; i < m; i++) { if(s[i] > d[i]) continue; if(t[i] == 'E' || t[i] == 'C') { ec[d[i]].pb(s[i]); } else { dm[d[i]].pb(s[i]); } } for(int i = 0; i <= n; i++) { a[i] = mod; } for(int i = 0; i <= m; i++) { b[i] = mod; } build(deoec, aec, 0, 0, n); build(deodm, adm, 0, 0, n); for(int i = 1; i <= n; i++) { for(int v : ec[i]) { add(deoec, aec, 0, v, 1, 0, 0, n); } for(int v : dm[i]) { add(deodm, adm, 0, v, 1, 0, 0, n); } a[i] = min(max(get(deoec, aec, 0, i, 0, 0, n), get(deodm, adm, 0, i, 0, 0, n)), mod); add(deoec, aec, i, i, a[i], 0, 0, n); add(deodm, adm, i, i, a[i], 0, 0, n); if(a[i] != mod) b[a[i]] = min(b[a[i]], i); } for(int i = m - 1; i >= 0; i--) { b[i] = min(b[i + 1], b[i]); } for(int i = 1; i <= m; i++) { printf("%d%c", b[i] == mod ? -1 : b[i], " \n"[i == m]); } } return 0; }