#include #define fi first #define se second using namespace std; typedef pair ii; const int N = 5e4; struct animal { bool black; int start; int des; bool operator < (const animal& p) const { return des < p.des; } } a[N+1]; int n,m,f[2][N+1],ans[N+1], c; ii it[2][N<<2|1]; void reset() { fill(f[0]+1, f[0]+m+1, 0); fill(f[1]+1, f[1]+m+1, 0); fill(it[0]+1, it[0]+(m<<2)+1, ii(0,0)); fill(it[1]+1, it[1]+(m<<2)+1, ii(0,0)); fill(ans+1, ans+n+1, -1); c = 1; } void enter() { char ch; for(int i=1; i<=n; ++i) { cin >> ch; a[i].black = ch=='E' || ch=='C'; } for(int i=1; i<=n; ++i) cin >> a[i].start; for(int i=1; i<=n; ++i) cin >> a[i].des; } int get(const ii& x) { return x.fi + x.se; } void update(bool black, int k,int l,int r,int u,int v, int inc = -1) { if (l>v || r=u && r<=v) { if (inc==-1) ++it[black][k].se; else { it[black][k].fi = inc; it[black][k].se = 0; } return; } int mid = l+r >> 1; int legacy = it[black][k].se; if (legacy) { it[black][k<<1].se += legacy; it[black][k<<1|1].se += legacy; it[black][k].se = 0; } update(black,k<<1,l,mid,u,v,inc); update(black,k<<1|1,mid+1,r,u,v,inc); it[black][k].fi = max(get(it[black][k<<1]), get(it[black][k<<1|1])); } void set_ans(int pos, int len) { while (c<=len) ans[c++] = pos; } void print() { for(int i=1; i<=n; ++i) cout << ans[i] << ' '; cout << '\n'; } int main() { ios_base::sync_with_stdio(0); int test; for(cin>>test; test; --test) { cin >> m >> n; reset(); enter(); sort(a+1, a+n+1); for(int i=1; i<=n; ++i) if (a[i].start < a[i].des) { update(1-a[i].black, 1,1,m, 1, a[i].start); int tmp = f[a[i].black][a[i].des] = get(it[1-a[i].black][1]); update(a[i].black, 1,1,m, a[i].des, a[i].des, tmp); set_ans(a[i].des, tmp); } print(); } }