#include #include #include #include #define ll long long using namespace std; const int MAXN = 50010; const int INF = 0x3f3f3f3f; struct sgt { #define lch ((o) << 1) #define rch (((o) << 1) | 1) #define mid (((L) + (R)) >> 1) int maxv[4 * MAXN], addv[4 * MAXN]; inline void clear() { memset(maxv, 0, sizeof(maxv)), memset(addv, 0, sizeof(addv)); } inline void reset(int o, int L, int R) { if(L < R) maxv[o] = max(maxv[lch], maxv[rch]); else maxv[o] = 0; maxv[o] += addv[o]; } int _l, _r, _x; inline void update(int o, int L, int R) { if(_l <= L && _r >= R) addv[o] += _x; else { int M = mid; if(_l <= M) update(lch, L, M); if(_r > M) update(rch, M+1, R); } reset(o, L, R); } } TB, TW; int Q, N, M; char type[MAXN][4]; int AS[MAXN], AT[MAXN], dp[MAXN], Ans[2 * MAXN]; vector WR[MAXN], BR[MAXN]; int main() { int i, k; scanf("%d", &Q); while(Q--) { scanf("%d%d", &N, &M); for(i = 1; i <= M; i++) scanf("%1s", type[i]); for(i = 1; i <= M; i++) scanf("%d", &AS[i]); for(i = 1; i <= M; i++) scanf("%d", &AT[i]); //clear & ins W & B for(i = 1; i <= N; i++) WR[i].clear(), BR[i].clear(); for(i = 1; i <= M; i++) if(AS[i] < AT[i]) { if(type[i][0] == 'C' || type[i][0] == 'E') WR[ AT[i] ].push_back( AS[i] ); else BR[ AT[i] ].push_back( AS[i] ); } //clear & dp TB.clear(), TW.clear(); for(i = 1; i <= N; i++) { //insert right pts for(k = 0; k < WR[i].size(); k++) TW._l = 1, TW._r = WR[i][k], TW._x = 1, TW.update(1, 1, N); for(k = 0; k < BR[i].size(); k++) TB._l = 1, TB._r = BR[i][k], TB._x = 1, TB.update(1, 1, N); dp[i] = max( TB.maxv[1], TW.maxv[1] ); //insert dec pt TW._l = TW._r = i, TW._x = dp[i], TW.update(1, 1, N); TB._l = TB._r = i, TB._x = dp[i], TB.update(1, 1, N); } //ans queries memset(Ans, 0x3f, sizeof(Ans)); for(i = 1; i <= N; i++) if(Ans[ dp[i] ] == INF) Ans[ dp[i] ] = i; for(i = M; i >= 1; i--) Ans[i] = min(Ans[i], Ans[i + 1]); //print for(i = 1; i <= M; i++) printf("%d ", (Ans[i] == INF ? -1 : Ans[i])); putchar('\n'); } }