#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define pi acos(-1.0)
#define eps 1e-8
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 20010;
struct node{
int l, r;
int x;
}tr[N * 4];
struct y{
int l, r;
}p[N];
int cnt, ans;
int vis[N], t[N];
void init( )
{
ans = cnt = 0;
memset( vis, 0, sizeof(vis) );
}
int b_sch( int pos )
{
int l = 1, mid, r = cnt;
while( l <= r )
{
//cout << "fwarfaer" << endl;
mid = ( l + r ) >> 1;
if( t[mid] > pos )
r = mid - 1;
else if( t[mid] < pos )
l = mid + 1;
else
break;
}
return mid;
}
void build ( int l, int r, int rt )
{
tr[rt].l = l;
tr[rt].r = r;
tr[rt].x = 0;
if( l == r )
return;
int mid = ( l + r ) >> 1;
build( lson );
build( rson );
}
void update( int l, int r, int rt, int col )
{
if( l <= tr[rt].l && tr[rt].r <= r )
{
tr[rt].x = col;
return;
}
if( tr[rt].x )
{
tr[rt<<1].x = tr[rt].x;
tr[rt<<1|1].x = tr[rt].x;
tr[rt].x = 0;
}
int mid = (tr[rt].l + tr[rt].r ) >> 1;
if( r <= mid )
update( l, r, rt<<1, col );
else if( l > mid )
update( l, r, rt<<1|1, col );
else
{
update( lson, col );
update( rson, col );
}
}
void query( int rt )
{
if( tr[rt].x )
{
if( !vis[ tr[rt].x ] )
{
vis[ tr[rt].x ] = 1;
ans++;
}
return;
}
query( rt << 1 );
query( rt << 1 | 1 );
}
int main()
{
int tot;
scanf("%d", &tot);
while( tot-- )
{
init();
int n;
scanf("%d", &n);
for( int i = 1; i <= n; i++ )
{
scanf("%d%d", &p[i].l, &p[i].r);
t[++cnt] = p[i].l, t[++cnt] = p[i].r;
}
sort( t + 1, t + cnt + 1 );
cnt = unique( t + 1, t + 1 + cnt ) - t - 1;
//cout << cnt << endl;
build( 1, cnt, 1 );
for( int i = 1; i <= n; i++ )
{
int l = b_sch( p[i].l );
int r = b_sch( p[i].r );
//cout << l << " " << r << endl;
update( l, r, 1, i );
}
query( 1 );
printf("%d\n", ans);
}
return 0;
}