#define problem "Animal Transport" #include #define Z (1 - 1) #define fi first #define se second using namespace std; const int maxN = 5e4 + 11; typedef int i_N[maxN]; typedef pair ii; int N, M; ii IT1[maxN * 4], IT2[maxN * 4]; char A[maxN]; i_N S, E, bit; vector P1[maxN], P2[maxN]; i_N F, G; void reset_data(){ for(int i = 1; i <= M; i++) P1[i].clear(), P2[i].clear(); for(int i = 1; i <= M * 4; i++) IT1[i] = IT2[i] = ii(Z, Z); memset(F, Z, sizeof(F)); memset(G, Z, sizeof(G)); } void update(int x, int v){ for(int i = x; i >= Z; i = (i & (i + 1)) - 1) bit[i] = min(bit[i], v); } int get_bit(int x){ int res = 1e9; for(int i = x; i <= N; i |= i + 1) res = min(res, bit[i]); return res; } void update(ii * IT, int k, int l, int r){ IT[k].fi += IT[k].se; if(l < r){ IT[k * 2].se += IT[k].se; IT[k * 2 + 1].se += IT[k].se; } IT[k].se = Z; } void update(ii * IT, int k, int l, int r, int i, int j, int v){ if(i <= l && j >= r) IT[k].se += v; update(IT, k, l, r); if(i <= l && j >= r) return; if(j < l || i > r) return; int mid = (l + r) / 2; update(IT, k * 2, l, mid, i, j, v); update(IT, k * 2 + 1, mid + 1, r, i, j, v); IT[k].fi = max(IT[k * 2].fi, IT[k * 2 + 1].fi); } int main(){ int test; cin >> test; while(test--){ cin >> M >> N; reset_data(); for(int i = 1; i <= N; i++) cin >> A[i]; 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(S[i] > E[i]) continue; if(A[i] == 'E' || A[i] == 'C') P1[E[i]].push_back(S[i]); else P2[E[i]].push_back(S[i]); } fill(bit, bit + N + 1, 1e9); for(int i = 1; i <= M; i++){ for(int j = Z; j < (int)P1[i].size(); j++){ int x = P1[i][j]; update(IT2, 1, 1, M, 1, x, 1); } for(int j = Z; j < (int)P2[i].size(); j++){ int x = P2[i][j]; update(IT1, 1, 1, M, 1, x, 1); } F[i] = IT2[1].fi; G[i] = IT1[1].fi; update(IT1, 1, 1, M, i, i, F[i]); update(IT2, 1, 1, M, i, i, G[i]); } for(int i = M; i >= 1; i--){ update(F[i], i); update(G[i], i); } for(int i = 1; i <= N; i++){ int x = get_bit(i); cout << (x == 1e9? -1 : x) << ' '; } cout << '\n'; } }