#include #include #include #include #include #include #define maxn 100005 using namespace std; struct tree { int l,r,val; }; tree d[maxn<<2]; int T,dp[maxn],n; struct Mine { int val,p; bool operator <(const Mine &x) const { if (val!=x.val) return valx.p; } }; Mine a[maxn]; void buildtree(int n,int l,int r) { d[n].l=l; d[n].r=r; d[n].val=0; if (l==r) { d[n].val=0; return; } int mid=(l+r)>>1; buildtree(n<<1,l,mid); buildtree(n<<1|1,mid+1,r); } void Insert(int n,int l,int val) { if (d[n].l==d[n].r) { d[n].val=val; return ; } int mid=(d[n].l+d[n].r)>>1; if (l<=mid) Insert(n<<1,l,val); else Insert(n<<1|1,l,val); d[n].val=max(d[n<<1].val,d[n<<1|1].val); } int Count(int n,int l,int r) { if (d[n].l==l && r==d[n].r) return d[n].val; int mid=(d[n].l+d[n].r)>>1; if (r<=mid) return Count(n<<1,l,r); else if (l>mid) return Count(n<<1|1,l,r); else return max(Count(n<<1,l,mid),Count(n<<1|1,mid+1,r)); } int main() { scanf("%d",&T); while (T--) { memset(a,0,sizeof(a)); memset(d,0,sizeof(d)); memset(dp,0,sizeof(dp)); scanf("%d",&n); buildtree(1,1,n); for (int i=1;i<=n;i++) { scanf("%d",&a[i].val); a[i].p=i; } sort(a+1,a+n+1); for (int i=1;i<=n;i++) { int c=Count(1,1,a[i].p); dp[a[i].p]=c+1; Insert(1,a[i].p,c+1); } for (int i=1;i