//最小的链划分数问题。根据dilworth定理
//为最大的反链的长度
//187MS 1860K
#include <iostream>
#include <algorithm>
using namespace std;
static const int INF = ~0U>>1;
static struct node
{
int w;
int h;
bool operator<(node&rs)
{
return w<rs.w||(w==rs.w&&h>rs.h);
}
}Nodes[20005];
static int n;
static int binsearch(int B[],int num,int l,int r)
{
int mid;
while(l<r)
{
mid = (l+r)/2;
if (num<=B[mid])//下降子序列
l = mid+1;
else
r = mid;
}
return l;
}
//用动规求解
static void DP()
{
int B[20010];
memset(B,0,sizeof(B));
//求最长下降子序列
int l=0,r;
int len = 0;
r = len;
for (int i=0;i<n;++i)
{
l = 0;r=len;
int index = binsearch(B,Nodes[i].h,l,r);
B[index] = Nodes[i].h;
if (len==index)
len++;
}
printf("%d\n",len);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for (int i=0;i<n;++i)
{
scanf("%d %d",&Nodes[i].w,&Nodes[i].h);
}
sort(Nodes,Nodes+n);
DP();
}
return 0;
}
//输出最长没有交叉
//109MS 2072K
//就是求最长上升子序列
#include <iostream>
#include <algorithm>
using namespace std;
static const int INF = ~0U>>1;
static struct _node
{
int l,r;
bool operator<(_node&b)
{
return l<b.l||(l==b.l&&r<b.r);
}
}Nodes[40005];
static int n;
static int binsearch(int B[],int num,int l,int r)
{
int mid;
while(l<r)
{
mid = (l+r)/2;
if (num<=B[mid])//上升子序列
r = mid;
else
l = mid+1;
}
return l;
}
//用动规求解
static void DP()
{
int B[40005];
memset(B,0,sizeof(B));
//求最长下降子序列
int l=0,r;
int len = 0;
r = len;
for (int i=0;i<n;++i)
{
B[i] = INF;
l = 0;r=len;
int index = binsearch(B,Nodes[i].r,l,r);
B[index] = Nodes[i].r;
if (len==index)
len++;
}
printf("%d\n",len);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for (int i=0;i<n;++i)
{
scanf("%d",&Nodes[i].r);
Nodes[i].l = i+1;
}
sort(Nodes,Nodes+n);
DP();
}
return 0;
}