/// In The Name Of God #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,sse3,sse4,popcnt,abm,mmx") #include #define f first #define s second #define pb push_back #define pp pop_back #define mp make_pair #define sz(x) (int)x.size() #define sqr(x) ((x) * 1ll * (x)) #define all(x) x.begin(), x.end() #define Kazakhstan ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0); #define nl '\n' #define ioi exit(0); typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int N = (int)5e4 + 7, inf = (int)1e9 + 7, mod = (int)1e9 + 7; const ll linf = (ll)1e18 + 7; const int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1}, dy[] = {0, 1, 0, -1, 1, -1, 1, -1}; using namespace std; int m, n; int type[N]; int dp[N]; int l[N], r[N]; struct tree { int t[N << 2], u[N << 2]; void push(int v) { if (u[v]) { t[v << 1] += u[v]; t[v << 1 | 1] += u[v]; u[v << 1] += u[v]; u[v << 1 | 1] += u[v]; u[v] = 0; } } void upd(int l, int r, int x, int v = 1, int tl = 1, int tr = m) { if (l <= tl && tr <= r) { u[v] += x; t[v] += x; return; } if (tl > r || tr < l) return; int tm = tl + tr >> 1; push(v); upd(l, r, x, v << 1, tl, tm); upd(l, r, x, v << 1 | 1, tm + 1, tr); t[v] = max(t[v << 1], t[v << 1 | 1]); } void pos(int p, int x, int v = 1, int tl = 1, int tr = m) { if (tl == tr) { t[v] = x; return; } int tm = tl + tr >> 1; push(v); if (p <= tm) pos(p, x, v << 1, tl, tm); else pos(p, x, v << 1 | 1, tm + 1, tr); t[v] = max(t[v << 1], t[v << 1 | 1]); } int get(int l, int r, int v = 1, int tl = 1, int tr = m) { if (l <= tl && tr <= r) return t[v]; if (tl > r || tr < l) return 0; int tm = tl + tr >> 1; push(v); return max(get(l, r, v << 1, tl, tm), get(l, r, v << 1 | 1, tm + 1, tr)); } void clear() { memset(t, 0, sizeof(t)); memset(u, 0, sizeof(u)); } } t[2]; void solve() { cin >> m >> n; vector < pair > open[m + 2]; memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) { char x; cin >> x; if (x == 'E') type[i] = 0; else if (x == 'D') type[i] = 1; else if (x == 'C') type[i] = 2; else type[i] = 3; } for (int i = 1; i <= n; i++) { cin >> l[i]; } for (int i = 1; i <= n; i++) { cin >> r[i]; if (l[i] > r[i]) continue; open[r[i]].pb({l[i], type[i]}); } t[0].clear(); t[1].clear(); for (int i = 1; i <= m; i++) { for (auto it : open[i]) { t[it.s & 1].upd(1, it.f, 1); } dp[i] = max(t[0].get(1, i), t[1].get(1, i)); t[0].upd(i, i, dp[i]); t[1].upd(i, i, dp[i]); } for (int i = 1; i <= n; i++) { int res = lower_bound(dp + 1, dp + 1 + m, i) - dp; if (dp[res] < i) res = -1; cout << res << ' '; } cout << nl; } int main() { #ifdef IOI2018 freopen ("in.txt", "r", stdin); #endif Kazakhstan int t = 1; cin >> t; while (t--) { solve(); } ioi }