#include<iostream> #include<algorithm> using namespace std; #define DEBUG_ENABLE 0 #define MAXN 20005 struct Operate{ char c; int l,r; }op[MAXN]; int seg[MAXN*4][2]; int f[MAXN*2]; struct SegmentTree{ int left[MAXN*8],right[MAXN*8]; int add[MAXN*8]; char fl[MAXN*8]; char fr[MAXN*8]; int num[MAXN*8]; inline void build(int k,int l,int r){ left[k]=l; right[k]=r; add[k]=0; fl[k]=fr[k]=0; num[k]=1; if(l==r) return ; int m=(l+r)>>1; build(k*2,l,m); build(k*2+1,m+1,r); } inline void push_up(int k){ //update fr[k]*fl[k] fl[k]=fl[k*2]+add[k]; fr[k]=fr[k*2+1]+add[k]; //update num[k] if(add[k]==0){ num[k]=num[k*2]+num[k*2+1]-(fr[k*2]==0&&fl[k*2+1]==0); } else{ num[k]=0; } return ; } inline void push_down(int k){ return ; } inline int binarySearch(int target,int n){ int low=0,high=n,mid; while(low<=high){ mid=(low+high)>>1; if(target>=seg[mid][0]&&target<=seg[mid][1]) return mid; else if(target<seg[mid][0]) high=mid-1; else low=mid+1; } return -1; } inline void press(int k,int l,int r){ if(l<=left[k]&&r>=right[k]){ add[k]++; fl[k]++;fr[k]++; if(add[k]) num[k]=0; return ; } else{ int m=(left[k]+right[k])>>1; if(l<=m){ press(k*2,l,r); } if(r>m){ press(k*2+1,l,r); } push_up(k); return ; } } inline void release(int k,int l,int r){ if(l<=left[k]&&r>=right[k]){ add[k]--; fl[k]--;fr[k]--; if(add[k]==0){ if(left[k]==right[k]) num[k]=1; else num[k]=num[k*2]+num[k*2+1]-(fr[k*2]==0&&fl[k*2+1]==0); } else{ num[k]=0; } return ; } else{ int m=(left[k]+right[k])>>1; if(l<=m){ release(k*2,l,r); } if(r>m){ release(k*2+1,l,r); } push_up(k); return ; } } inline void run(int m,int n){ int i; int l,r; for(i=0;i<m;i++) if(op[i].c=='p'){ l=binarySearch(op[i].l,n); r=binarySearch(op[i].r,n); press(1,l,r); cout<<num[1]<<endl; } else{ l=binarySearch(op[i].l,n); r=binarySearch(op[i].r,n); release(1,l,r); cout<<num[1]<<endl; } } #if (DEBUG_ENABLE == 1) inline void debug(int k){ printf("ID = %2d, 左儿子 = %2d, 右儿子 = %2d, left = %2d, right = %2d, add = %2d/n",k,k*2,k*2+1,left[k],right[k],add[k]); if(left[k]==right[k]) return ; debug(k*2); debug(k*2+1); } #endif }sgt; int main() { int t; cin>>t; int cas=1; while(t--){ int n,m; cin>>n>>m; int i,j; j=0; for(i=0;i<m;i++){ cin>>op[i].c>>op[i].l>>op[i].r; f[j++]=op[i].l; f[j++]=op[i].r; } sort(f,f+j); int num=j; for(i=j=1;i<num;i++) if(f[i]!=f[i-1]) f[j++]=f[i]; num=j; if(num==1){ seg[0][0]=seg[0][1]=0; } else{ int nn=n-1; n=0; if(f[0]!=0){ seg[0][0]=0; seg[0][1]=f[0]-1; n=1; } for(i=0;i<num-1;i++){ seg[n][0]=f[i]; seg[n++][1]=f[i]; if(f[i]+1!=f[i+1]){ seg[n][0]=f[i]+1; seg[n++][1]=f[i+1]-1; } } seg[n][0]=f[num-1]; seg[n++][1]=f[num-1]; if(f[num-1]!=nn){ seg[n][0]=f[num-1]+1; seg[n++][1]=nn; } } // for(i=0;i<n;i++) // cout<<seg[i][0]<<" "<<seg[i][1]<<endl; sgt.build(1,0,n-1); // sgt.debug(1); cout<<"Case #"<<cas++<<":/n"; sgt.run(m,n-1); } // system("pause"); }