#include using namespace std; typedef long long ll; typedef pair pii; typedef pair pll; typedef vector vi; typedef vector vvi; typedef vector vll; typedef set si; typedef map mii; const int N = 50005; vector adjList[N], ans; int dp[N][2],tree[4*N][2],lazy[4*N][2],type[N],s[N],d[N]; void propagate_lazy(int pos, int l,int r,int dim){ if(!lazy[pos][dim]) return; tree[pos][dim] += lazy[pos][dim]; if(l != r){ lazy[2*pos][dim] += lazy[pos][dim]; lazy[2*pos+1][dim] += lazy[pos][dim]; } lazy[pos][dim] = 0; } int query(int pos, int l, int r, int qLow, int qHigh, int dim){ propagate_lazy(pos,l,r,dim); if(qLow > r || qHigh < l) return 0; if(l >= qLow && r<=qHigh) return tree[pos][dim]; int mid = (l+r)/2; return max(query(pos*2,l,mid,qLow,qHigh,dim), query(pos*2+1,mid+1,r,qLow,qHigh,dim)); } void update(int pos, int l, int r, int qLow, int qHigh, int dim, int v){ propagate_lazy(pos,l,r,dim); if(qLow > r || qHigh < l) return; if(l >= qLow && r <= qHigh){ lazy[pos][dim] += v; propagate_lazy(pos,l,r,dim); return; } int mid =(l+r)/2; update(pos*2,l,mid,qLow,qHigh,dim,v); update(pos*2+1,mid+1,r,qLow,qHigh,dim,v); tree[pos][dim] = max(tree[pos*2][dim], tree[pos*2+1][dim]); } int main(){ int n,m,t; scanf("%d",&t); while(t--){ memset(tree,0,sizeof tree); memset(lazy,0,sizeof lazy); ans.clear(); scanf("%d%d",&m,&n); for(int i = 1;i<=m;i++) adjList[i].clear(); for(int i = 1;i<=n;i++) { char c; scanf("%*c%c",&c); type[i] = (c == 'D' || c == 'M')?0:1; } for(int i = 1;i<=n;i++) scanf("%d",&s[i]); for(int i = 1;i<=n;i++) { scanf("%d",&d[i]); adjList[d[i]].push_back(i); } for(int i=1;i<=m;i++){ for(int j = 0;j