#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
#define N 500010

int rr[N*4];
int a[N];
int dp[N];

vector<int> e[N];
vector<pair<int,int> > f[N];

void build(int tt,int l,int r){

    if(l==r){
        rr[tt]=0;
        return;
    }
    int mid = (l+r)/2;
    build(tt*2,l,mid);
    build(tt*2+1,mid+1,r);
    rr[tt] = 0;
}

void update(int tt,int l,int r,int x,int pos){
    if(l==r){
        rr[tt]=max(pos,rr[tt]);
        return;
    }
    int mid = (l + r)/2;
    if(x>mid)
        update(tt*2+1,mid+1,r,x,pos);
    else
        update(tt*2,l,mid,x,pos);

    rr[tt]=max(rr[tt*2+1],rr[tt*2]);
}

int query(int tt,int l,int r,int L,int R){
    if(L==l&&r==R){
        return rr[tt];
    }
    int mid = (l+r)/2;

    if(L>mid)
        return query(tt*2+1,mid+1,r,L,R);
    else if(R<=mid)
        return query(tt*2,l,mid,L,R);
    else
        return max(query(tt*2+1,mid+1,r,mid+1,R),
                   query(tt*2,l,mid,L,mid));
}

void solve(){

    int n,m,x,y;
    scanf("%d",&n);
    build(1,1,n+1);

    for(int i=0;i<=n+1;i++){
        dp[i]=0;
        e[i].clear();
        f[i].clear();
    }

    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        update(1,1,n+1,a[i],i);
        x = query(1,1,n+1,a[i]+1,n+1);
        f[x].push_back(pair<int,int>(a[i],i));
    }

    build(1,1,n+1);
    for(int i=1;i<=n;i++){

        dp[i]=max(dp[i],query(1,1,n+1,1,a[i])+1);
        for(int j=0;j<e[i].size();j++){
            dp[i]=max(dp[i],e[i][j]+1);
        }
        update(1,1,n+1,a[i],dp[i]);

        for(int j=0;j<f[i].size();j++){
            e[f[i][j].second].push_back(query(1,1,n+1,1,f[i][j].first)+1);
        }
    }
    printf("%d\n",rr[1]);
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        solve();
    }
    return 0;
}
