#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef pair ii; typedef vector vi; typedef pair ll; typedef pair il; long long mod = 1000000007LL; long long large = 2000000000000000000LL; int n,m; vector > adj0,adj1; vector ty,s,d; vector dp; vector addv,maxi; void maintain(int o,int l,int r){ if(l==r){ maxi[o] = addv[o]; }else{ maxi[o] = max(maxi[o*2],maxi[o*2+1])+addv[o]; } } int ul,ur,uv; void update(int o,int l,int r){ if(ur=r){ addv[o]+=uv; }else{ int m = (l+r)/2; if(ul<=m) update(o*2,l,m); if(ur>m) update(o*2+1,m+1,r); } maintain(o,l,r); } int ql,qr,re; void query(int o,int l,int r,int add){ if(qr=r){ re = max(re,maxi[o]+add); }else{ int m = (l+r)/2; if(ql<=m) query(o*2,l,m,add+addv[o]); if(qr>m) query(o*2+1,m+1,r,add+addv[o]); } } void compute(int l,int r){ if(l==r) return ; int m = (l+r)/2; compute(l,m); int sz = r-l+1; addv.assign(4*sz+5,0); maxi = addv; for(int i=l;i<=m;i++){ uv = dp[i]; ul = ur = i-l; update(1,0,sz-1); for(int j=0;j<(int)adj0[i].size();j++){ ul = 0; ur = adj0[i][j]-l; uv = 1; update(1,0,sz-1); } } for(int i=m+1;i<=r;i++){ for(int j=0;j<(int)adj0[i].size();j++){ ul = 0; ur = adj0[i][j]-l; uv = 1; update(1,0,sz-1); } ql = 0; qr = m-l; re = 0; query(1,0,sz-1,0); dp[i] = max(dp[i],re); } addv.assign(4*sz+5,0); maxi = addv; for(int i=l;i<=m;i++){ uv = dp[i]; ul = ur = i-l; update(1,0,sz-1); for(int j=0;j<(int)adj1[i].size();j++){ ul = 0; ur = adj1[i][j]-l; uv = 1; update(1,0,sz-1); } } for(int i=m+1;i<=r;i++){ for(int j=0;j<(int)adj1[i].size();j++){ ul = 0; ur = adj1[i][j]-l; uv = 1; update(1,0,sz-1); } ql = 0; qr = m-l; re = 0; query(1,0,sz-1,0); dp[i] = max(dp[i],re); } compute(m+1,r); } int main(){ int test; cin>>test; while(test--){ cin>>m>>n; ty.assign(n,0); s.assign(n,0); d.assign(n,0); for(int i=0;i>c; if(c=='E'||c=='C'){ ty[i] = 1; } } for(int i=0;i()); adj1 = adj0; for(int i=0;id[i]) continue; if(ty[i]==0){ adj0[d[i]].push_back(s[i]); }else{ adj1[d[i]].push_back(s[i]); } } dp.assign(m,0); compute(0,m-1); int pos = 0; for(int i=1;i<=n;i++){ while(pos