#include using namespace std; #define MAXSIZE 50010 bool type[MAXSIZE+10]; int source[MAXSIZE+10]; vector L[2][MAXSIZE+10]; struct node{ int s,e; int lazyadd=0; int maxi=0; node *l,*r; node(int a,int b){ s=a;e=b; if(a==b)return; int m=(a+b)/2; l=new node(a,m); r=new node(m+1,b); } void clean(){ if(lazyadd==0)return; maxi+=lazyadd; if(s==e){ lazyadd=0; return; } l->lazyadd+=lazyadd; r->lazyadd+=lazyadd; lazyadd=0; } void update(int a,int b,int v){ clean(); if(s==a && b==e){ lazyadd+=v; return; } int m=(s+e)/2; if(b<=m){ l->update(a,b,v); } else if(mupdate(a,b,v); } else{ l->update(a,m,v); r->update(m+1,b,v); } l->clean(); r->clean(); maxi=max(l->maxi,r->maxi); } int query(int a,int b){ clean(); if(s==a && b==e){ return maxi; } int m=(s+e)/2; if(b<=m){ return l->query(a,b); } else if(mquery(a,b); } return max(l->query(a,m),r->query(m+1,b)); } }; int dp[MAXSIZE+10]; int main() { //freopen("hi.txt","r",stdin); int tc; int a,b,c; scanf("%d",&tc); while(tc--){ int m,n; scanf("%d%d",&m,&n); char str[10]; for(int i=0;ia)continue; L[type[i]][a].push_back(source[i]); } dp[0]=0; node *tree0=new node(1,m); node *tree1=new node(1,m); vectorans; for(int i=1;i<=m;i++){ for(int j:L[0][i]){ tree0->update(1,j,1); } for(int j:L[1][i]){ tree1->update(1,j,1); } dp[i]=max(tree0->query(1,m),tree1->query(1,m)); tree0->update(i,i,dp[i]); tree1->update(i,i,dp[i]); //printf("dp %d=%d\n",i,dp[i]); while(dp[i]>ans.size()){ ans.push_back(i); } } while(ans.size()