#include <bits/stdc++.h>
using namespace std;
#define int ll
using ll = long long;
using db = long double;
using pi = pair<int, int>;
using mi = map<int, int>;
#define fi first
#define se second
#define vt vector
#define sz size()
#define eb emplace_back
#define endl '\n'
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
ll qpow(ll a,ll b,ll MOD=mod){for(ll ans=1;;a=a*a%MOD,b>>=1){if(b&1)ans=ans*a%MOD;if(!b)return ans;}}
ll inv(ll a,ll MOD=mod){return qpow(a,MOD-2,MOD);}//Ҫ��MODΪ����
ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0){x=1,y=0;return a;}ll ret=exgcd(b,a%b,y,x);y-=a/b*x;return ret;}
ll getInv(int a,int mod){ll x,y;ll d=exgcd(a,mod,x,y);return d==1?(x%mod+mod)%mod:-1;}//��a��mod�µ���Ԫ����������Ԫ����-1����Ҫ��MODΪ����

using vi = vt<int>;
const int N = 4e5 + 5;
int  M = 1e9 + 7;

inline int add(int x, int y) { return x + y >= M ? x + y - M : x + y; }
inline int mul(int x, int y) { return x * y % M; }
inline int sub(int x, int y) { return x - y < 0 ? x - y + M : x - y; }


using G = vt<vi>;

#define mid (l+r>>1)
#define lc p<<1
#define rc lc|1
#define lson lc,l,mid
#define rson rc,mid+1,r
void upd(int pos, int val, int n, vector<int>&c)
{
    for(int i = pos; i <= n; i += i & -i)
    {
        c[i] = max(c[i], val);
    }
}
int get(int pos, int n, vector<int>& c)
{
    int ans = 0;
    for(int i = pos; i; i -= i & -i)
    {
        ans = max(ans, c[i]);
    }
    return ans;
}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        n++;
        vector<int>a(n + 1, 0);
        vector<int>nxt(n + 1,0);
        vector< vector<int> > p(n + 1);
        vector<int> dp(n + 1, 0);
        vector<int>c(n + 1, 0);
        a[1] = 1;
        rep(i, 2, n)
        {
            cin >> a[i];
            a[i]++;
        }
        stack<int>st;
        per(i, n, 1)
        {
            while(!st.empty() && a[st.top()] < a[i])
            {
                st.pop();
            }
            if(!st.empty())
            {
                nxt[i] = st.top();
                p[st.top()].eb(i);
            }
            st.push(i);
        }
        for(int i = 1; i <= n; i++)
        {
            a[i] = n + 1 - a[i];
        }
        dp[n] = 1;
        per(i, n, 1)
        {
       //     cout << i << endl;
            for(int x : p[i])
            {
                dp[x] = max(dp[x], 2 + get(a[x], n, c));
            //    cout << "x=" << x << ' ' << dp[x] << endl;

            }
         //   cout << "dp[i] = " << dp[i] << ' ';
            dp[i] = max(dp[i], 1 + get(a[i], n ,c));
        //    cout << dp[i] << ' ' << a[i] << endl;
        //    cout << dp[i] << endl;
            upd(a[i], dp[i], n, c);
        }
        cout << dp[1] - 1<< endl;

    }
}
