func_code_string: #include <bits/stdc++.h>   #define int long long   using namespace std;   const int maxm=5e5+5;   int stk[maxm],head;   int d[maxm];   int a[maxm];   int n;   //   int rt[maxm],tot;   int lc[maxm*40],rc[maxm*40],ma[maxm*40];   inline void pp(int k){       ma[k]=max(ma[lc[k]],ma[rc[k]]);   }   void update(int x,int val,int l,int r,int &k,int last){       k=++tot;       lc[k]=lc[last];       rc[k]=rc[last];       if(l==r){           ma[k]=val;           return ;       }       int mid=(l+r)/2;       if(x<=mid)update(x,val,l,mid,lc[k],lc[last]);       else update(x,val,mid+1,r,rc[k],rc[last]);       pp(k);   }   int ask(int st,int ed,int l,int r,int k){       if(!k)return 0;       if(st<=l&&ed>=r)return ma[k];       int mid=(l+r)/2;       int ans=0;       if(st<=mid)ans=max(ans,ask(st,ed,l,mid,lc[k]));       if(ed>mid)ans=max(ans,ask(st,ed,mid+1,r,rc[k]));       return ans;   }   //   void solve(){       cin>>n;       //init       tot=0;       ma[0]=0;       //       for(int i=1;i<=n;i++){           cin>>a[i];       }       int ans=0;       head=0;       for(int i=1;i<=n;i++){           while(head&&a[stk[head]]<a[i]){               head--;           }           d[i]=1;           d[i]=max(d[i],ask(1,a[i],1,n,rt[i-1])+1);           if(head){               int k=stk[head];               d[i]=max(d[i],ask(1,a[i],1,n,rt[k-1])+2);           }           update(a[i],d[i],1,n,rt[i],rt[i-1]);           stk[++head]=i;           ans=max(ans,d[i]);       }       cout<<ans<<endl;   }   signed main(){       ios::sync_with_stdio(0);       int T;cin>>T;       while(T--){           solve();       }       return 0;   }   