#include #define F first #define S second #define mp make_pair #define pb push_back #define ll long long #define LEFT(a) ((a)<<1) #define RIGHT(a) (LEFT(a) + 1) #define MID(a,b) ((a+b)>>1) #define MAX(a,b) ((a)>(b)?(a):(b)) #define MIN(a,b) ((a)<(b)?(a):(b)) using namespace std; const int N = 200005; int Tes; int m, n; vector < int > v[2][N]; int dp[N], ans[N]; int t[N]; int s[N], d[N]; int nn, T[2][N], p[2][N]; void update (int I, int k, int l, int r, int L, int R, int x){ if (R < l || r < L) return; if (L <= l && r <= R){ p[I][k] += x; T[I][k] += x; return; } update (I, LEFT (k), l, MID (l,r), l, MID (l,r), p[I][k]); update (I, RIGHT (k), MID (l,r) + 1, r, MID (l,r) + 1, r, p[I][k]); p[I][k] = 0; update (I, LEFT (k), l, MID (l,r), L, R, x); update (I, RIGHT (k), MID (l,r) + 1, r, L, R, x); T[I][k] = max (T[I][LEFT (k)], T[I][RIGHT (k)]); } int calc (int I, int k, int l, int r, int L, int R){ if (R < l || r < L) return 0; if (L <= l && r <= R) return T[I][k]; update (I, LEFT (k), l, MID (l,r), l, MID (l,r), p[I][k]); update (I, RIGHT (k), MID (l,r) + 1, r, MID (l,r) + 1, r, p[I][k]); p[I][k] = 0; int x = calc (I, LEFT (k), l, MID (l,r), L, R); int y = calc (I, RIGHT (k), MID (l,r) + 1, r, L, R); T[I][k] = max (T[I][LEFT (k)], T[I][RIGHT (k)]); return max (x, y); } int main() { cin>>Tes; while (Tes--){ cin>>m>>n; for (int i = 1; i <= m; i++) for (int j = 0; j < 2; j++) v[j][i].clear (); for (int i = 1; i <= n; i++){ char ch; cin>>ch; if (ch == 'C' || ch == 'E') t[i] = 0; else t[i] = 1; } for (int i = 1; i <= n; i++) cin>>s[i]; for (int i = 1; i <= n; i++) cin>>d[i]; for (int i = 1; i <= n; i++) if (s[i] < d[i]) v[t[i]][d[i]].pb (s[i]); for (int i = 0; i < 2; i++) for (int j = 1; j <= m * 4; j++) T[i][j] = 0, p[i][j] = 0; nn = 1; while (nn < m) nn *= 2; for (int i = 1; i <= m; i++){ for (int I = 0; I < 2; I++) for (int j = 0; j < v[I][i].size(); j++) update (I, 1, 1, nn, 1, v[I][i][j], 1); int x = calc (0, 1, 1, nn, 1, i - 1); int y = calc (1, 1, 1, nn, 1, i - 1); dp[i] = max (x, y); update (0, 1, 1, nn, i, i, dp[i]); update (1, 1, 1, nn, i, i, dp[i]); } for (int i = 1; i <= n; i++) ans[i] = -1; for (int i = m; i >= 1; i--) ans[dp[i]] = i; for (int i = n - 1; i >= 1; i--) if (ans[i + 1] != -1) if (ans[i] == -1 || ans[i] > ans[i + 1]) ans[i] = ans[i + 1]; for (int i = 1; i <= n; i++) cout<