#include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include //#include #include #include #include #define boost std::ios::sync_with_stdio(false)//;cin.tie(0) #define F first #define S second #define tr(container, it) for(__typeof(container.begin()) it = container.begin(); it != container.end(); it++) #define trr(container, it) for(__typeof(container.rbegin()) it = container.rbegin(); it != container.rend(); it++) #define pb push_back #define in insert #define mp make_pair #define fi(var,a,b) for(int var=a;var<=b;var++) #define fe(var,a,b) for(int var=a;var vi; typedef vector vvi; typedef pair pi; typedef pair psi; //------------------------segment tree---------------------------------------------------------------------------------------------------------------// typedef struct segtree { int x,tsize;// n--->array tsize--->tree_size vi tree;vi ltree; segtree(int xx) { x=xx; tsize=getsize(); tree.resize(tsize,0); ltree.resize(tsize,0); } int query(int n,int a,int b,int i,int j) { if(a>j||b=i&&b<=j) return tree[n]; return max(query(2*n,a,(a+b)/2,i,j),query(2*n+1,1+(a+b)/2,b,i,j)); } int query(int l,int r)//send l and r in 0 based indexing { return query(1,0,x-1,l,r);//tweak?!! } void update(int n,int a,int b,int i,int j,int v) { if(ltree[n]!=0) { tree[n]+=ltree[n]; if(a!=b) { ltree[2*n]+=ltree[n]; ltree[2*n+1]+=ltree[n]; } ltree[n]=0; } if(a>j||b=i&&b<=j) { tree[n]+=v; if(a!=b) { ltree[2*n]+=v; ltree[2*n+1]+=v; } return; } update(2*n,a,(a+b)/2,i,j,v); update(2*n+1,1+(a+b)/2,b,i,j,v); tree[n]=max(tree[2*n],tree[2*n+1]); } void update(int l,int r,int v) { update(1,0,x-1,l,r,v);//tweak?!! } int getsize() { int s=1; while(s>test; while(test--) { int m,n; cin(m);cin(n); vvi adj0(55555); vvi adj1(55555); vi s(55555); vi d(55555); vector cc(55555); fe(i,0,n) cin>>cc[i]; fe(i,0,n) cin(s[i]); fe(i,0,n) cin(d[i]); fe(i,0,n) { if(cc[i]=='D'||cc[i]=='M') adj0[d[i]].pb(s[i]); else adj1[d[i]].pb(s[i]); } vvi dp(m+1,vi(2,0)); segtree seg0(m+1); segtree seg1(m+1); fi(i,2,m) { tr(adj0[i],it) seg1.update(1,*it,1); tr(adj1[i],it) seg0.update(1,*it,1); dp[i][0]=seg1.query(1,i-1); dp[i][1]=seg0.query(1,i-1); seg1.update(i,i,dp[i][1]); seg0.update(i,i,dp[i][0]); } vi ans(m+1,-1); fi(i,1,m) { //cout<<"for i "<=1;i--) { if(ans[i+1]!=-1) ans[i]=min(ans[i],ans[i+1]); } fi(i,1,n) cout<