#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for(int i=0; i=b; --i) #define ALL(c) (c).begin(), (c).end() typedef long long ll; typedef vector VI; typedef vector VL; typedef vector VVI; typedef vector VVL; typedef pair P; typedef pair PL; typedef vector VD; const int INF = 1e9; struct SqrtDecomposition{ const int INF = 1e9; int n, sqrtn, k; VI dat, buk, lazy; vector lazyflag; void init(int x){ n = x; sqrtn = sqrt(n); sqrtn = 250; k = (n + sqrtn - 1) / sqrtn; dat.assign(sqrtn * k, -INF); buk.assign(k, -INF); lazy.assign(k, 0); lazyflag.assign(k, false); } void eval(int b){ if (!lazyflag[b]) return; lazyflag[b] = false; FOR(i, sqrtn * b, sqrtn * (b+1) - 1){ dat[i] += lazy[b]; } lazy[b] = 0; } // [l, r) void add(int l, int r, int x){ REP(b,k){ int p = sqrtn * b; int q = sqrtn * (b+1); if (q <= l || r <= p) continue; if (l <= p && q <= r){ buk[b] += x; lazyflag[b] = true; lazy[b] += x; }else{ eval(b); FOR(i,max(l,p),min(r,q)-1){ dat[i] += x; } buk[b] = -INF; FOR(i,p,q-1){ buk[b] = max(buk[b], dat[i]); } } } } // [l, r) int query(int l, int r){ int ret = -INF; REP(b,k){ int p = sqrtn * b; int q = sqrtn * (b+1); if (q <= l || r <= p) continue; if (l <= p && q <= r){ ret = max(ret, buk[b]); }else{ eval(b); FOR(i,max(l,p),min(r,q)-1){ ret = max(ret, dat[i]); } } } return ret; } }; void solve(){ int n, m; cin >> m >> n; vector c(n); vector

p(n); REP(i,n){ cin >> c[i]; } REP(i,n){ cin >> p[i].first; p[i].first--; } REP(i,n){ cin >> p[i].second; p[i].second--; } // string str = "ECAB"; // REP(i,n){ // c[i] = str[rand() % 4]; // int x = rand() % m; // } vector

p1, p2; REP(i,n){ if (p[i].first > p[i].second) continue; if (c[i] == 'E' || c[i] == 'C'){ p1.push_back(p[i]); }else{ p2.push_back(p[i]); } } VI ans(n+1, INF); VI ans2 = ans; if (n <= 3010){ VI dp(m+1); REP(i,m){ VI d1, d2; REP(j,p1.size()){ if (p1[j].first >= i) d1.push_back(p1[j].second); } REP(j,p2.size()){ if (p2[j].first >= i) d2.push_back(p2[j].second); } sort(ALL(d1)); sort(ALL(d2)); REP(j,d1.size()){ dp[d1[j]] = max(dp[d1[j]], dp[i] + j + 1); } REP(j,d2.size()){ dp[d2[j]] = max(dp[d2[j]], dp[i] + j + 1); } } // REP(i,m+1) cout << dp[i] << " "; // cout << endl; int ma = 0; REP(i,m+1){ if (dp[i] > ma){ FOR(x,ma+1,dp[i]) ans2[x] = i; ma = dp[i]; } } } VVI s1(m), s2(m); for (P p : p1) s1[p.second].push_back(p.first); for (P p : p2) s2[p.second].push_back(p.first); SqrtDecomposition sd1, sd2; sd1.init(m); sd2.init(m); sd1.add(0,1,INF); sd2.add(0,1,INF); VI dp(m); FOR(i,1,m-1){ for (int x : s1[i]) sd1.add(0, x+1, 1); for (int x : s2[i]) sd2.add(0, x+1, 1); dp[i] = max(sd1.query(0, i), sd2.query(0, i)); sd1.add(i, i+1, dp[i] - sd1.query(i, i+1)); sd2.add(i, i+1, dp[i] - sd2.query(i, i+1)); } int ma = 0; REP(i,m){ if (dp[i] > ma){ FOR(x,ma+1,dp[i]) ans[x] = i; ma = dp[i]; } } if (n <= 3010){ if (ans != ans2){ cout << "error!!!" << endl; } } FOR(i,1,n){ printf("%d ", ans[i] == INF ? -1 : ans[i] + 1); } cout << endl; } int main() { int t; cin >> t; while (t--){ solve(); } return 0; }