1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=10010; 6 #define lson l,m,rt<<1 7 #define rson m+1,r,rt<<1|1 8 int a[maxn];int b[maxn];int x[maxn*3];int flag[maxn]; 9 int cor[maxn<<4]; 10 int cnt=0; 11 int trans(int num,int l,int r) 12 { 13 // int m=(l+r)>>1; 14 // if(num==x[m]) return m; 15 // if(num>x[m]) return trans(num,m+1,r); 16 // if(num<trans) return trans(num,l,m); 17 while(l<=r) 18 { 19 int m=(l+r)>>1; 20 if(x[m]==num) return m; 21 if(num>x[m]) l=m+1; 22 else r=m; 23 } 24 return -1; 25 } 26 void pushdown(int rt) 27 { 28 if(cor[rt]!=-1) 29 { 30 cor[rt<<1]=cor[rt]; 31 cor[rt<<1|1]=cor[rt]; 32 cor[rt]=-1; 33 } 34 } 35 void update(int a,int b,int i,int l,int r,int rt) 36 { 37 if(a<=l&&b>=r) 38 { 39 cor[rt]=i; 40 return; 41 } 42 pushdown(rt); 43 int m=(r+l)>>1; 44 if(a<=m) update(a,b,i,lson); 45 if(b>m) update(a,b,i,rson); 46 } 47 void query(int l,int r,int rt) 48 { 49 if(cor[rt]!=-1) 50 { 51 if(!flag[cor[rt]]) 52 { 53 cnt++; 54 flag[cor[rt]]=1; 55 } 56 return; 57 } 58 if(l==r) return; 59 int m=(r+l)>>1; 60 query(lson); 61 query(rson); 62 } 63 int main() 64 { 65 int cases,n; 66 scanf("%d",&cases); 67 while(cases--) 68 { 69 scanf("%d",&n); 70 memset(cor,-1,sizeof(cor)); 71 int pointer=0; 72 for(int i=0;i<n;i++) 73 { 74 scanf("%d%d",&a[i],&b[i]); 75 x[pointer++]=a[i]; 76 x[pointer++]=b[i]; 77 } 78 sort(x+1,x+pointer); 79 int pointer2=1; 80 for(int i=1;i<pointer;i++) 81 { 82 if(x[i]!=x[i-1]) x[pointer2++]=x[i]; 83 } 84 for(int i=pointer2-1;i>=0;i--) 85 { 86 if(x[i]!=x[i-1]+1) x[pointer2++]=x[i-1]+1; 87 } 88 sort(x,x+pointer2); 89 for(int i=0;i<n;i++) 90 { 91 int l=trans(a[i],0,pointer2-1); 92 int r=trans(b[i],0,pointer2-1); 93 update(l,r,i,0,pointer2-1,1); 94 } 95 cnt=0; 96 memset(flag,0,sizeof(flag)); 97 query(0,pointer2-1,1); 98 printf("%d ",cnt); 99 } 100 return 0; 101 }