#include using namespace std; #define rep(i,a,n) for (int i=a;i=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector VI; typedef long long ll; typedef pair PII; const ll mod=1000000007; ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} // head const int N=101000; struct node { int fg,s; }; struct segment { node nd[4*N]; void upd(int p) { nd[p].s=max(nd[p+p].s,nd[p+p+1].s); } void setf(int p,int v) { nd[p].s+=v; nd[p].fg+=v; } void build(int p,int l,int r) { nd[p].fg=0; nd[p].s=0; if (l==r) { } else { int md=(l+r)>>1; build(p+p,l,md); build(p+p+1,md+1,r); upd(p); } } void push(int p) { if (nd[p].fg) { setf(p+p,nd[p].fg); setf(p+p+1,nd[p].fg); nd[p].fg=0; } } int query(int p,int l,int r,int tl,int tr) { if (tl==l&&tr==r) return nd[p].s; else { push(p); int md=(l+r)>>1; if (tr<=md) return query(p+p,l,md,tl,tr); else if (tl>md) return query(p+p+1,md+1,r,tl,tr); else return max(query(p+p,l,md,tl,md),query(p+p+1,md+1,r,md+1,tr)); } } void modify(int p,int l,int r,int tl,int tr,int v) { if (tl>tr) return; if (tl==l&&tr==r) return setf(p,v); else { push(p); int md=(l+r)>>1; if (tr<=md) modify(p+p,l,md,tl,tr,v); else if (tl>md) modify(p+p+1,md+1,r,tl,tr,v); else modify(p+p,l,md,tl,md,v),modify(p+p+1,md+1,r,md+1,tr,v); upd(p); } } }T[2]; int _,n,m,ty[N],a[N],b[N],dp[N],ret[N]; char s[20]; vector e[N]; int main() { for (scanf("%d",&_);_;_--) { scanf("%d%d",&m,&n); m*=2; T[0].build(1,1,m); T[1].build(1,1,m); rep(i,1,m+1) e[i].clear(); rep(i,0,n) { scanf("%s",s); ty[i]=(s[0]=='E'||s[0]=='C'); } rep(i,0,n) scanf("%d",a+i); rep(i,0,n) scanf("%d",b+i); rep(i,0,n) if (b[i]>a[i]) e[2*b[i]-1].pb(mp(2*a[i],ty[i])); rep(i,1,n+1) ret[i]=-1; ret[n+1]=-1; rep(i,1,m+1) { for (auto p:e[i]) T[p.se].modify(1,1,m,1,p.fi-1,1); dp[i]=max(T[0].query(1,1,m,1,i),T[1].query(1,1,m,1,i)); T[0].modify(1,1,m,i,i,dp[i]); T[1].modify(1,1,m,i,i,dp[i]); if (ret[dp[i]]==-1) ret[dp[i]]=(i+1)/2; } per(i,1,n+1) if (ret[i]==-1&&ret[i+1]!=-1) ret[i]=ret[i+1]; rep(i,1,n+1) printf("%d%c",ret[i]," \n"[i==n]); } }