#include<map>
#include<vector>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//线段树区间染色,对于杂色区间tree赋-1.没有颜色赋值为0,其他颜色为正整数代表的颜色类型
//找染了多少种颜色
map<int,int>mp;
int ans;
vector<int>v;
int n,t;
int x[1000000],y[1000000];
int tree[40010*4];
int lazy[40010*4];
int color[40010*4];
void pushdown(int i)
{
if(lazy[i])
{
tree[i*2]=lazy[i];
tree[i*2+1]=lazy[i];
lazy[i*2]=lazy[i];
lazy[i*2+1]=lazy[i];
lazy[i]=0;
}
}
void pushup(int i)
{
if(tree[i*2+1]!=tree[i*2])
{
tree[i]=-1;
}
else
{
tree[i]=tree[i*2];
}
}
void update(int i,int l,int r,int x,int y,int t)
{
if(l>=x&&r<=y)
{
tree[i]=t;
lazy[i]=t;
return;
}
pushdown(i);
int mid=l+r>>1;
if(x<=mid)
update(i*2,l,mid,x,y,t);
if(y>mid)
update(i*2+1,mid+1,r,x,y,t);
pushup(i);
}
void query(int i,int l,int r,int x,int y)
{
if(l>=x&&r<=y)
{
if(tree[i]==0)
{
return ;
}
else if(tree[i]>0)
{
if(color[tree[i]]==0)
{
ans++;
color[tree[i]]=1;
}
}
else
{
pushdown(i);
int mid=l+r>>1;
if(x<=mid)
query(i*2,l,mid,x,y);
if(y>mid)
query(i*2+1,mid+1,r,x,y);
}
return;
}
pushdown(i);
int mid=l+r>>1;
if(x<=mid)
query(i*2,l,mid,x,y);
if(y>mid)
query(i*2+1,mid+1,r,x,y);
return ;
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(tree,0,sizeof(tree));
memset(lazy,0,sizeof(lazy));
memset(color,0,sizeof(color));
ans=0;
scanf("%d",&n);
int cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
if(!mp[x[i]])
mp[x[i]]=1,v.push_back(x[i]);
if(!mp[y[i]])
mp[y[i]]=1,v.push_back(y[i]);
}
sort(v.begin(),v.end());
for(int i=0;i<v.size();i++)
{
mp[v[i]]=++cnt;
}
for(int i=1;i<=n;i++)
{
int xx=mp[x[i]];
int yy=mp[y[i]];
update(1,1,cnt,xx,yy,i);
}
query(1,1,cnt,1,cnt);
printf("%d\n",ans);
}
return 0;
}