#include using namespace std; #define N 51000 vector v[N][2]; int st[N], en[N], val[N]; int ans[N][2]; #define inf N int f[N * 4][2]; int add[N * 4][2]; void push_down(int id) { for(int i = 0; i < 2; i ++) { add[id * 2][i] += add[id][i]; add[id * 2 + 1][i] += add[id][i]; f[id * 2][i] += add[id][i]; f[id * 2 + 1][i] += add[id][i]; add[id][i] = 0; } } void push_up(int id) { for(int i = 0; i < 2; i ++) { f[id][i] = max(f[id * 2][i], f[id * 2 + 1][i]); } } void add_val(int st, int en, int id, int l, int r, int pos, int val) { if(st > r || en < l) return; if(st >=l && en <= r) { add[id][pos] += val; f[id][pos] += val; return; } push_down(id); int mid = (st + en) >> 1; add_val(st, mid, id * 2, l, r, pos, val); add_val(mid + 1, en, id * 2 + 1, l, r, pos, val); push_up(id); } int get_val(int st, int en, int id, int l, int r, int pos) { if(st > r || en < l) return 0; if(st >= l && en <= r) { return f[id][pos]; } push_down(id); int mid = (st + en) >> 1; int left = get_val(st, mid, id * 2, l, r, pos); int right = get_val(mid + 1, en, id * 2 + 1, l, r, pos); push_up(id); return max(left, right); } void build(int st, int en, int id) { add[id][0] = add[id][1] = 0; f[id][0] = f[id][1] = 0; if(st == en) { return; } int mid = (st + en) >> 1; build(st, mid, id * 2); build(mid + 1, en, id * 2 + 1); } char s[10]; int main() { //freopen("1.in", "r", stdin); int T, n, m; scanf("%d", &T); for(int tc = 0; tc < T; tc ++) { scanf("%d%d", &n, &m); for(int i = 1; i <= m; i ++) { scanf("%s", s); if(s[0] == 'E' || s[0] == 'C') val[i] = 0; else val[i] = 1; } for(int i = 1; i <= m; i ++) scanf("%d", &st[i]); for(int i = 1; i <= m; i ++) scanf("%d", &en[i]); for(int i = 1; i <= n; i ++) { v[i][0].clear(); v[i][1].clear(); } for(int i = 1; i <= m; i ++) { if(en[i] < st[i]) { continue; } //printf("%d %d %d\n", en[i], val[i], st[i]); v[en[i]][val[i]].push_back(st[i]); } for(int i = 1; i <= n; i ++) { sort(v[i][0].begin(), v[i][0].end()); sort(v[i][1].begin(), v[i][1].end()); } build(0, n, 1); for(int i = 1; i <= n; i ++) { for(int id = 0; id < 2; id ++) { ans[i][id] = 0; if(v[i][id].size() == 0) continue; for(int j = 0; j < v[i][id].size(); j ++) { //printf("%d %d %d\n", 0, v[i][id][j] - 1, 1 - id); add_val(0, n, 1, 0, v[i][id][j], 1 - id, 1); } int x = v[i][id][v[i][id].size() - 1]; ans[i][id] = get_val(0, n, 1, 0, x, 1 - id); add_val(0, n, 1, i, i, id, ans[i][id]); } } for(int i = 1; i <= m; i ++) val[i] = inf; for(int i = 1; i <= n; i ++) { for(int j = 0; j < 2; j ++) { int x = ans[i][j]; val[x] = min(val[x], i); } } for(int i = m - 1; i >= 1; i --) { val[i] = min(val[i], val[i + 1]); } for(int i = 1; i <= m; i ++) { if(i > 1) printf(" "); if(val[i] == inf) { printf("-1"); } else { printf("%d", val[i]); } } puts(""); } }