#include #define task "test" #define X first #define Y second using namespace std; const int N=5E4+120; struct def { int l, r, ty; bool operator < (const def &a) { if(r==a.r)return l> m >> n; n_=n; n=0; for(int i=1; i<=n_; ++i) { char c; cin>>c; if(c=='D' || c=='M')b[i].ty=1; if(c=='E' || c=='C')b[i].ty=2; } for(int i=1; i<=n_; ++i)cin>>b[i].l; for(int i=1; i<=n_; ++i)cin>>b[i].r; for(int i=1; i<=n_; ++i)if(b[i].l<=b[i].r)a[++n]=b[i]; sort(a+1, a+1+n); } void updatePos (int node, int l, int r, int pos, int id) { if( needUpd[node][id] ) { it_max[node][id] += needUpd[node][id]; if(l pos || r < pos)return; if(pos<= l && r <=pos) { it_max[node][id] = dp[pos]; } else { int mid = (l+r)/2; updatePos (node*2, l, mid, pos, id); updatePos (node*2+1, mid+1, r, pos, id); it_max[node][id] = max(it_max[node*2][id], it_max[node*2+1][id]); } } void update (int node, int l, int r, int L, int R, int id) { if( needUpd[node][id] ) { it_max[node][id] += needUpd[node][id]; if(l R || r < L)return; if(L<= l && r <=R) { it_max[node][id] += 1; if(l R || r < L)return 0; if(L<= l && r <=R) { return it_max[node][id]; } else { int ret = 0; int mid = (l+r)/2; ret = get (node*2, l, mid, L, R, id); ret = max( ret, get (node*2+1, mid+1, r, L, R, id) ); it_max[node][id] = max(it_max[node*2][id], it_max[node*2+1][id]); return ret; } } void Solve() { memset(it_max, 0, sizeof(it_max)); memset(needUpd, 0, sizeof(needUpd)); memset(dp, 0, sizeof(dp)); int ini=0; for(int i=1; i<=m; ++i) { while(ini<=n && a[ini].rn || a[ini].r>i); else while(ini<=n && a[ini].r==i) { update(1, 1, m, 1, a[ini].l, a[ini].ty); //update(1, 1, m, 1, a[ini].l, 2); ++ini; } //cout<=i) { ans = mid; r = mid-1; } else l = mid+1; } cout<> cases; for(int a0 = 0; a0 < cases; a0++){ Read(); Solve(); } return 0; }