#include using namespace std; #define REP(i, n) for (int i = 0; i < int(n); ++i) #define REPE(i, a, b) for (int i = (a); i <= int(b); ++i) #define SZ(x) ((int)(x).size()) #define ALL(x) x.begin(), x.end() #define PB push_back #define EB emplace_back using LL = long long; using PII = pair; #define F first #define S second void R(int &x) { scanf("%d", &x); } void R(LL &x) { scanf("%lld", &x); } void R(double &x) { scanf("%lf", &x); } template void R(T &t) { cin >> t; } template void R(vector &ar) { for (auto &it : ar) R(it); } template void R(T &t, Args &... args) { R(t); R(args...); } const int maxn = 5e4 + 10; #define LCH o+o,l,m #define RCH o+o+1,m+1,r struct Seg { int n; int a[maxn<<2], mx[maxn<<2]; void clear(int m) { n = m; memset(a, 0, sizeof a); memset(mx, 0, sizeof mx); } void push(int o, int l, int r) { if (l < r) { a[o+o] += a[o]; mx[o+o] += a[o]; a[o+o+1] += a[o]; mx[o+o+1] += a[o]; a[o] = 0; } } int add(int o, int l, int r, int ql, int qr) { if (ql <= l && r <= qr) { mx[o]++; a[o]++; } else { push(o, l, r); int m = (l + r) >> 1; if (ql <= m) add(LCH, ql, qr); if (qr > m) add(RCH, ql, qr); mx[o] = max(mx[o+o], mx[o+o+1]); } return mx[o]; } int add(int l, int r) { return add(1, 1, n, l, r); } void set(int o, int l, int r, int p, int v) { if (l == r) { a[o] = mx[o] = v; } else { int m = (l + r) >> 1; if (p <= m) set(LCH, p, v); else set(RCH, p, v); mx[o] = max(mx[o+o], mx[o+o+1]); } } void set(int p, int v) { set(1, 1, n, p, v); } } dp[2]; array a[maxn]; int d[maxn]; int ans[maxn]; const int inf = 1e9; void solve() { int m, n; R(m, n); REP(i, n) { char s[4]; scanf("%s", s); a[i][2] = s[0] == 'E' || s[0] == 'C'; } REP(i, n) R(a[i][1]); // from REP(i, n) R(a[i][0]); // to const int on = n; REP(i, n) while (i < n && a[i][1] >= a[i][0]) { a[i] = a[--n]; } sort(a, a + n); dp[0].clear(m); dp[1].clear(m); fill(d, d + m + 1, 0); REP(i, n) { auto &x = a[i]; int v = dp[x[2]].add(1, x[1]); // printf("%d - %d type %d: v = %d\n", x[1], x[0], x[2], v); dp[x[2] ^ 1].set(x[0], v); d[x[0]] = max(d[x[0]], v); } fill(ans, ans + on + 1, inf); for (int i = m; i >= 0; --i) ans[d[i]] = i; for (int i = on - 1; i >= 1; --i) ans[i] = min(ans[i], ans[i + 1]); REPE(i, 1, on) printf("%d%c", ans[i] >= inf ? -1 : ans[i], " \n"[i == on]); } int main() { int T; R(T); while (T--) solve(); return 0; }