#include #define pii pair #define fi first #define se second #define mp make_pair #define pb push_back #define eb emplace_back #define pf push_front #define pb2 pop_back #define pf2 pop_front #define line printf("\n") #define pq priority_queue #define rep(k,i,j) for(int k = (int)i;k<(int)j;k++) #define repd(k,i,j) for(int k = (int)i;k>=(int)j;k--) #define ll long long #define ALL(a) a.begin(),a.end() #define vi vector using namespace std; double EPS = 1e-9; int INF = 1e9+7;; long long INFLL = 1e17; double pi = acos(-1); int dirx[8] = {-1,0,0,1,-1,-1,1,1}; int diry[8] = {0,1,-1,0,-1,1,-1,1}; clock_t first_attempt = clock(); inline void cek_time(){ clock_t cur = clock()- first_attempt; cerr<<"TIME : "<<(double) cur/CLOCKS_PER_SEC< #include using namespace __gnu_pbds; typedef tree, rb_tree_tag, tree_order_statistics_node_update> bbst; //end of template const int maxn = 5e4+5; const int maxs = 4*maxn + 5; int n,m; int t[maxn],s[maxn],d[maxn]; struct segtree{ int lazy[maxs], arr[maxs]; void relax(int a){ arr[a] += lazy[a]; if(2*ar)return; if(l<=ki && ka<=r){ lazy[a] += v; relax(a); return; } int mid = (ki+ka)>>1; upd(2*a,ki,mid); upd(2*a+1,mid+1,ka); arr[a] = max(arr[2*a],arr[2*a+1]); } int query(int a,int ki,int ka){ relax(a); if(kar)return 0; if(l<=ki && ka<=r)return arr[a]; int mid = (ki+ka)>>1; return max(query(2*a,ki,mid),query(2*a+1,mid+1,ka)); } void update(int ki,int ka,int vv){ l = ki,r = ka,v = vv; upd(1,0,maxn); } int query(int ki,int ka){ l = ki,r = ka; return query(1,0,maxn); } void reset(){ memset(arr,0,sizeof arr); memset(lazy,0,sizeof lazy); } }seg[2]; vi adj[2][maxn]; int dp[maxn]; int val[maxn]; int main(){ int tc; cin>>tc; while(tc--){ cin>>m>>n; rep(k,1,n+1){ char c; scanf(" %c",&c); if(c=='D' || c=='M')t[k] = 0; else t[k] = 1; } rep(k,1,n+1)scanf("%d",&s[k]); rep(k,1,n+1)scanf("%d",&d[k]); rep(k,0,2)seg[k].reset(); rep(k,0,2)rep(i,0,maxn)adj[k][i].clear(); rep(k,1,n+1)if(s[k]