#include #define lc (pos<<1) #define rc (pos<<1|1) using namespace std; int f[50005],n,m; int typ[50005],s[50005],t[50005]; int n1[50005],n2[50005]; int t1[50005],t2[50005]; int st[50005],top=0; vector v1[50005],v2[50005]; inline int max(int a,int b) {return a>b?a:b;} struct G {int maxn[200005],tag[200005]; inline void down(int pos) {if (tag[pos]) {tag[lc]+=tag[pos];maxn[lc]+=tag[pos]; tag[rc]+=tag[pos];maxn[rc]+=tag[pos]; tag[pos]=0; } } void add(int pos,int l,int r,int lp,int rp,int num) {if (l==lp&&r==rp){maxn[pos]+=num;tag[pos]+=num;return;} down(pos);int mid=(l+r)>>1; if (rp<=mid) add(lc,l,mid,lp,rp,num); if (lp>mid) add(rc,mid+1,r,lp,rp,num); if (lp<=mid&&rp>mid) {add(lc,l,mid,lp,mid,num); add(rc,mid+1,r,mid+1,rp,num); } maxn[pos]=max(maxn[lc],maxn[rc]); } }A,B; inline void solve() {int i,j;top=0; memset (f,0,sizeof(f)); memset (n1,0,sizeof(n1)); memset (n2,0,sizeof(n2)); memset (t1,0,sizeof(t1)); memset (t2,0,sizeof(t2)); char ss[23]; scanf ("%d%d",&m,&n); for (i=1;i<=4*m;i++) {A.maxn[i]=B.maxn[i]=A.tag[i]=B.tag[i]=0;} for (i=1;i<=n;i++) {scanf ("%s",ss); if (ss[0]=='E'||ss[0]=='C') {typ[i]=1;} else {typ[i]=2;} } for (i=1;i<=n;i++) scanf ("%d",&s[i]); for (i=1;i<=n;i++) scanf ("%d",&t[i]); for (i=1;i<=m;i++) {v1[i].clear(); v2[i].clear(); } for (i=1;i<=n;i++) {if (typ[i]==1) {v1[t[i]].push_back(s[i]);} else {v2[t[i]].push_back(s[i]);} } A.add(1,0,m,0,0,0); B.add(1,0,m,0,0,0); f[0]=0; for (i=1;i<=m;i++) {for (j=0;j