#include #define name "e" using namespace std; const int maxn=5e4+100; struct o{ int l,r,cs,loai; }; int n,m,ans; o c[maxn]; int res[maxn]; int f[maxn][3]; int it[maxn*8][3],lazy[maxn*8][3]; bool ss(o a,o b){ return(a.l>m>>n; for (int i=1;i<=n;i++){ char x; cin>>x; if (x=='D' || x=='M')c[i].loai=1; else c[i].loai=2; // cout<>c[i].l; } for (int i=1;i<=n;i++){ cin>>c[i].r; c[i].cs=i; } } void sinh(int l,int r,int i,int loai){ if (l==r){ it[i][loai]=0; return; } int mid=(l+r)>>1; sinh(l,mid,i*2,loai); sinh(mid+1,r,i*2+1,loai); it[i][loai]=0; } void updatelazy(int i,int l,int r,int loai){ it[i][loai]+=lazy[i][loai]; if (l>1; findit(u,v,l,mid,i*2,loai); findit(u,v,mid+1,r,i*2+1,loai); it[i][loai]=max(it[i*2][loai],it[i*2+1][loai]); } void update(int u,int w,int l,int r,int i,int loai){ updatelazy(i,l,r,loai); if (u==l && l==r){ it[i][loai]=max(it[i][loai],w); return; } if (r>1; update(u,w,l,mid,i*2,loai); update(u,w,mid+1,r,i*2+1,loai); it[i][loai]=max(it[i*2][loai],it[i*2+1][loai]); } void updatecong(int u,int v,int l,int r,int i,int loai){ updatelazy(i,l,r,loai); if (r>1; updatecong(u,v,l,mid,i*2,loai); updatecong(u,v,mid+1,r,i*2+1,loai); it[i][loai]=max(it[i*2][loai],it[i*2+1][loai]); } void xuli(){ sort(c+1,c+1+n,ss); // for (int i=1;i<=n;i++){ // cout<c[i].r)continue; if (c[i].loai==1){ findit(1,c[i].r,1,m,1,1); findit(1,c[i].l,1,m,1,2); f[i][1]=ans+1; update(c[i].r,f[i][1],1,m,1,1); updatecong(c[i].r+1,m,1,m,1,1); } else { findit(1,c[i].r,1,m,1,2); findit(1,c[i].l,1,m,1,1); f[i][2]=ans+1; update(c[i].r,f[i][2],1,m,1,2); updatecong(c[i].r+1,m,1,m,1,2); } // cout<=1;i--){ res[i]=min(res[i],res[i+1]); } for (int i=1;i<=n;i++){ if (res[i]==maxn)cout<<"-1 ";else cout<>test; while (test--){ nhap(); xuli(); } }