#include #define fir first #define sec second using namespace std; typedef long long LL; typedef unsigned long long u64; template inline bool cmin(T & a, const T & b) { return a > b ? a = b, 1 : 0;} template inline bool cmax(T & a, const T & b) { return a < b ? a = b, 1 : 0;} int read() { int x = 0, f = 1;char ch; for(ch = getchar(); !isdigit(ch); ch = getchar()) if(ch == '-') f = -1; for(; isdigit(ch); x = x * 10 + ch - '0', ch = getchar()); return x * f; } const int MaxN = 501234; int n, m, ty[MaxN], s[MaxN], t[MaxN], f[MaxN], ans[MaxN], S[2][MaxN]; struct SegTree { int seg[MaxN << 2], tag[MaxN << 2]; #define lc(p) (p << 1) #define rc(p) (lc(p) | 1) #define mid (l + r >> 1) void push_down(int p, int l, int r) { if(l == r) return; seg[lc(p)] += tag[p]; seg[rc(p)] += tag[p]; tag[lc(p)] += tag[p]; tag[rc(p)] += tag[p]; tag[p] = 0; } void modify(int p, int l, int r, int a, int b, int d = -1) { if(a > r || b < l) return; if(a <= l && r <= b) { tag[p] += d; seg[p] += d; return; } push_down(p, l, r); modify(lc(p), l, mid, a, b, d); modify(rc(p), mid + 1, r, a, b, d); seg[p] = max(seg[lc(p)], seg[rc(p)]); } int query(int p, int l, int r, int a, int b) { if(a > r || b < l) return -1e9; if(a <= l && r <= b){ return seg[p]; } push_down(p, l, r); return max(query(lc(p), l, mid, a, b), query(rc(p), mid + 1, r, a, b)); } void clear() { memset(seg, 0, sizeof(seg)); memset(tag, 0, sizeof(tag)); } }T[2]; vector ed[MaxN]; void solve() { int i, j, k; m = read(); n = read(); for(i = 1; i <= n; i++) { char s[3]; scanf("%s", s); ty[i] = (s[0] == 'E' || s[0] == 'C'); } for(i = 1; i <= n; i++) s[i] = read(); for(i = 1; i <= n; i++) t[i] = read(); for(i = 1; i <= m; i++) ed[i].clear(); for(i = 1; i <= n; i++) if(s[i] <= t[i]) ed[t[i]].push_back(i); T[0].clear(); T[1].clear(); for(i = 2; i <= m; i++) { for(auto x : ed[i]) { T[ty[x]].modify(1, 0, m, s[x], m); } for(k = 0; k < 2; k++) { cmax(f[i], T[k].query(1, 0, m, 0, i - 1) - T[k].query(1, 0, m, i, i)); } for(k = 0; k < 2; k++) T[k].modify(1, 0, m, i - 1, i - 1, f[i]); } for(i = 1; i <= m; i++) if(f[i] != f[i - 1]) for(j = f[i - 1] + 1; j <= f[i]; j++) ans[j] = i; for(i = 1; i <= n; i++) if(!ans[i]) printf("-1 "); else printf("%d ", ans[i]); puts(""); } int main() { int T = read(); while(T--) { memset(f, 0, sizeof(f)); memset(S, 0, sizeof(S)); memset(ans, 0, sizeof(ans)); solve(); } return 0; }