#include using namespace std; #include #include using namespace __gnu_pbds; template using ordered_set = tree, rb_tree_tag, tree_order_statistics_node_update>; //set // using ordered_set = tree, rb_tree_tag, tree_order_statistics_node_update>; // multiset static int LOCAL=0; #define length(a) (sizeof(a)/sizeof(a[0])) #define print(v,i,x) for(int j=i;j<=x;j++){cout<=n;i--) #define ROFl(i,x,n) for(lli i=x;i>=n;i--) #define debug(x) cout << " - " << #x << ": " << x << endl; #define debugs(x, y) cout << " - " << #x << ": " << x << " " << #y << ": " << y << endl; #define debugss(x, y, z) cout << " - " << #x << ": " << x << " " << #y << ": " << y << " " << #z << ": " << z << endl; #define fastIO std::ios::sync_with_stdio(false);cin.tie(NULL); #define cut cout<<"------------------------------------------\n"; #define cut1 cout<<"******************************************\n"; typedef vector vi; typedef vector> vii; typedef vector vlli; typedef vector vstr; typedef pair prii; typedef pair prilli; typedef pair prllii; typedef pair prllilli; const lli mod = 1000000007ll; const lli MOD = 1000000009ll; const lli INF = LLONG_MAX/10; const int inf = INT_MAX/2; lli count_bit(lli _x){lli _ret=0;while(_x){if(_x%2==1)_ret++;_x/=2;}return _ret;} bool check_bit(lli _mask,lli _i){lli x=1;return (_mask&(x<<_i))==0?false:true;} lli set_bit(lli _mask,lli _i){lli x=1;_mask=_mask|(x<<_i);return _mask;} lli msb(lli _mask){lli ret=-1;int cnt=0;while(_mask){if(_mask&1)ret=cnt;_mask/=2;cnt++;}return ret;} lli powermod(lli _a,lli _b,lli _m=mod){lli _r=1;while(_b){if(_b%2==1)_r=(_r*_a)%_m;_b/=2;_a=(_a*_a)%_m;}return _r;} lli power(lli _a,lli _b){lli _r=1;while(_b){if(_b%2==1)_r=(_r*_a);_b/=2;_a=(_a*_a);}return _r;} lli add(lli a,lli b,lli m=mod){lli x=a+b;while(x>=m)x-=m;return x;} lli sub(lli a,lli b,lli m=mod){lli x=a-b;while(x<0)x+=m;return x;} lli mul(lli a,lli b,lli m=mod){lli x=a*b;x%=m;return x;} lli gcd(lli a,lli b){while(a&&b)a>b?a%=b:b%=a;return a+b;} lli lcm(lli a,lli b){return (max(a,b)/gcd(a,b))*min(a,b);} struct pair_hash { std::size_t operator () (const std::pair &p) const { auto h1 = std::hash{}(p.first); auto h2 = std::hash{}(p.second); return h1 ^ h2; } }; struct cmp{ bool operator()(pair const & l,pair const & r){ return true; } }myobject; struct Segtree{ typedef int stt; static const int MAXN = 50010; struct Node{ stt val; stt lazy; Node(){val=0;lazy=0;} }; struct Node tr[4*MAXN]; void clr(){ FOR(i,0,4*MAXN-1)tr[i].val=0,tr[i].lazy=0; //memset(tr,0,sizeof(tr)); } Node Merge(Node a,Node b){ struct Node temp; // create combined node temp.val=max(a.val,b.val); temp.lazy=0; return temp; } void lazyupd(int node,int st,int en){ if(st>en) return; if(tr[node].lazy == 0) return; // update this node tr[node].val+=tr[node].lazy; if(st!=en){ tr[2*node].lazy += tr[node].lazy; tr[2*node+1].lazy += tr[node].lazy; } tr[node].lazy = 0; } void Update(int node,int st,int en,int l,int r,stt v){ lazyupd(node,st,en); if(l>en || rr) return; if(l<=st && en<=r){ tr[node].lazy+=v; lazyupd(node,st,en); return; } int mid=(st+en)>>1; Update(2*node,st,mid,l,r,v); Update(2*node+1,mid+1,en,l,r,v); tr[node]=Merge(tr[2*node],tr[2*node+1]); } Node Query(int node,int st,int en,int l,int r){ lazyupd(node,st,en); if(l>en || rr) return Node(); if(l<=st && en<=r) return tr[node]; int mid=(st+en)>>1; return Merge(Query(2*node,st,mid,l,r),Query(2*node+1,mid+1,en,l,r)); } }; const int N=50010; Segtree ST[2]; int n,m,t,s,d,ty[N],st[N],en[N],dp1[N],dp2[N],dp[N],ans[N]; char c; vi adj[2][N]; int main() { LOCAL=0; if(LOCAL){ freopen("C:\\Users\\Smit Patel\\Downloads\\D-large.in","r",stdin); freopen("C:\\Users\\Smit Patel\\Desktop\\out.txt","w",stdout); } fastIO; cin>>t; while(t--){ ST[0].clr(); ST[1].clr(); memset(dp1,0,sizeof(dp1)); memset(dp2,0,sizeof(dp2)); memset(dp,0,sizeof(dp)); FOR(i,0,N-10){adj[0][i].clear();adj[1][i].clear();} cin>>m>>n; FOR(i,1,n){ cin>>c; if(c=='D' || c=='M') ty[i]=0; else ty[i]=1; } FOR(i,1,n)cin>>st[i]; FOR(i,1,n){ cin>>en[i]; if(en[i]>st[i]) adj[ty[i]][en[i]].pb(st[i]); } FOR(i,1,m){ FOR(j,0,1) for(auto p:adj[j][i]) ST[j].Update(1,1,m,1,p,1); dp1[i]=ST[0].Query(1,1,m,1,i-1).val; dp2[i]=ST[1].Query(1,1,m,1,i-1).val; ST[0].Update(1,1,m,i,i,dp2[i]); ST[1].Update(1,1,m,i,i,dp1[i]); dp[i]=max(dp1[i],dp2[i]); } fill(ans,ans+N,inf); ROF(i,m,1)ans[dp[i]]=min(ans[dp[i]],i); int cur=inf; ROF(i,n,1){ cur=min(cur,ans[i]); ans[i]=cur; } FOR(i,1,n)if(ans[i]==inf)ans[i]=-1; print(ans,1,n); } return 0; }