#include using namespace std; #define sd(x) scanf("%d",&x) #define slld(x) scanf("%lld",&x) #define ss(x) scanf("%s",x) #define mod 1000000007 #define bitcount __builtin_popcountll #define ll long long #define pb push_back #define pi pair #define pii pair #define mp make_pair int tree[600005][2],lazy[600005][2]; int type[50005]; int src[50005],dest[50005]; int ans[50005]; vectorv; void build(int node, int l, int r) { if(l==r) { tree[node][0]=tree[node][1]=lazy[node][0]=lazy[node][1]=0; return; } build(node*2,l,(l+r)/2); build(node*2+1,(l+r)/2+1,r); tree[node][0]=tree[node][1]=0; lazy[node][0]=lazy[node][1]=0; } void update(int node, int l, int r, int i, int j, int val, int type) { if(lazy[node][0]!=0||lazy[node][1]!=0) { tree[node][0]+=lazy[node][0]; tree[node][1]+=lazy[node][1]; if(l!=r) { lazy[node*2][0]+=lazy[node][0]; lazy[node*2+1][0]+=lazy[node][0]; lazy[node*2][1]+=lazy[node][1]; lazy[node*2+1][1]+=lazy[node][1]; } lazy[node][0]=lazy[node][1]=0; } if(i>r||l>j||i>j||l>r) return; if(l>=i&&r<=j) { tree[node][type]+=val; if(l!=r) { lazy[node*2][type]+=val; lazy[node*2+1][type]+=val; } return; } update(node*2,l,(l+r)/2,i,j,val,type); update(node*2+1,(l+r)/2+1,r,i,j,val,type); tree[node][0]=max(tree[node*2][0],tree[node*2+1][0]); tree[node][1]=max(tree[node*2][1],tree[node*2+1][1]); } void update2(int node, int l, int r, int pos, int val) { if(lazy[node][0]!=0||lazy[node][1]!=0) { tree[node][0]+=lazy[node][0]; tree[node][1]+=lazy[node][1]; if(l!=r) { lazy[node*2][0]+=lazy[node][0]; lazy[node*2+1][0]+=lazy[node][0]; lazy[node*2][1]+=lazy[node][1]; lazy[node*2+1][1]+=lazy[node][1]; } lazy[node][0]=lazy[node][1]=0; } if(pos>r||l>pos) return; if(l>=pos&&r<=pos) { tree[node][0]=max(tree[node][0],val); tree[node][1]=max(tree[node][1],val); return; } update2(node*2,l,(l+r)/2,pos,val); update2(node*2+1,(l+r)/2+1,r,pos,val); tree[node][0]=max(tree[node*2][0],tree[node*2+1][0]); tree[node][1]=max(tree[node*2][1],tree[node*2+1][1]); } int query(int node, int l, int r, int i, int j, int type) { if(i>r||l>j||i>j||l>r) return 0; if(lazy[node][0]!=0||lazy[node][1]!=0) { tree[node][0]+=lazy[node][0]; tree[node][1]+=lazy[node][1]; if(l!=r) { lazy[node*2][0]+=lazy[node][0]; lazy[node*2+1][0]+=lazy[node][0]; lazy[node*2][1]+=lazy[node][1]; lazy[node*2+1][1]+=lazy[node][1]; } lazy[node][0]=lazy[node][1]=0; } if(l>=i&&r<=j) { return tree[node][type]; } int left=query(node*2,l,(l+r)/2,i,j,type); int right=query(node*2+1,(l+r)/2+1,r,i,j,type); return max(left,right); } int main() { int i,j,k; int t,n,m; char ch; sd(t); while(t--) { sd(m); sd(n); build(1,1,m); v.clear(); for(i=1;i<=n;i++) { cin>>ch; if(ch=='E'||ch=='C') type[i]=0; else type[i]=1; } // printf("here\n"); for(i=1;i<=n;i++) { sd(src[i]); ans[i]=-1; } for(i=1;i<=n;i++) sd(dest[i]); for(i=1;i<=n;i++) { if(dest[i]