//Bismillahir Rahmanir Rahim #include using namespace std; #define MAX 600000 #define MEMSET(x,y) memset(x, y, sizeof(x)) #define PB push_back #define MP make_pair int ar[MAX+9], PR[MAX+9], ANS[MAX+9], ST[MAX+9], EN[MAX+9], tree[2][MAX+9], lazy[2][MAX+9]; vector KEEP[MAX+9]; void godown(int node, int beg,int end, int flag) { if(!lazy[flag][node]) return; int mid = (beg+end)/2; tree[flag][node*2]+=lazy[flag][node]; tree[flag][node*2+1]+=lazy[flag][node]; lazy[flag][node*2]+=lazy[flag][node]; lazy[flag][node*2+1]+=lazy[flag][node]; lazy[flag][node]=0; return; } void goup(int node, int beg, int end, int flag) { tree[flag][node]=max(tree[flag][node*2],tree[flag][node*2+1]); } void update(int node,int beg,int end,int i, int j, int value, int flag) { if(beg>j || end=i && end<=j) { tree[flag][node]+=value; lazy[flag][node]+=value; return ; } godown(node,beg,end,flag); int mid = (beg+end)/2; update(node*2,beg,mid,i,j,value,flag); update(node*2+1,mid+1,end,i,j,value,flag); goup(node,beg,end,flag); } int query(int node,int beg,int end,int i,int j, int flag) { if(beg>j || end=i && end<=j) return tree[flag][node]; godown(node,beg,end,flag); int mid = (beg+end)/2; return max(query(node*2,beg,mid,i,j,flag),query(node*2+1,mid+1,end,i,j,flag)); } int main() { int i,j,k,l,m,n,ans,tot,sum,temp,test,siz,lst; char ch; cin>>test; while(test--) { cin>>m>>n; memset(ANS, 0, sizeof(ANS)); memset(PR, -1, sizeof(PR)); memset(tree, 0, sizeof(tree)); memset(lazy, 0, sizeof(lazy)); m++; for(i=0;i<=m+5;i++) KEEP[i].clear(); for(i=1; i<=n; i++) { cin>>ch; if(ch=='E' || ch=='C') ar[i] = 1; else ar[i] = 0; } for(i=1; i<=n; i++) cin>>ST[i]; for(i=1; i<=n; i++) ST[i]++; for(i=1; i<=n; i++) cin>>EN[i]; for(i=1; i<=n; i++) EN[i]++; for(i=1; i<=n; i++) KEEP[EN[i]].PB(i); for(i=2; i<=m; i++) { siz = KEEP[i].size(); ANS[i] = ANS[i-1]; for(j=0; j