#include<iostream> //最长严格上升子序列(LIS)算法,时间复杂度为O(nlogn)
using namespace std;
int seq[40010]; //seq[i]是记录在所有最长严格上升子序列的长度为 i 之中,选取结束位置上最小的值
int main()
{
int cases,n,p;
cin>>cases;
while(cases--)
{
cin>>n>>p;
int rear=0;
seq[++rear]=p;
while(--n)
{
cin>>p;
if(p>seq[rear]) //当p==seq[rear],不能压入最长严格上升子序列中
seq[++rear]=p;
else
{
int s=1,t=rear,mid; //在最长严格上升子序列中找到第一个大于p的数,并用p替换之。但如果有相同的元素已经在子序列出现,比如子序列是 3 4 , 要插入的值 p=3, 则子序列仍旧是 3 4 ,即插入的位置是相同的那个元素出现的位置(也就是不做任何改变)
while(s<t)
{
mid=(s+t)/2;
if(seq[mid]<p)
s=mid+1;
else //当seq[mid]==p时, t=mid, 因为若有相同元素出现,p要替换的并不是比p大的那个数,而是相同的那个数(即不做改变)
t=mid;
}
seq[s]=p;
}
}
cout<<rear<<endl; //最长严格上升子序列的长度
}
return 0;
}