#include using namespace std; typedef long long int uli; int rint(char nxt){ char ch=getchar(); int v=0; int sgn=1; if(ch=='-')sgn=-1; else{ assert('0'<=ch&&ch<='9'); v=ch-'0'; } while(true){ ch=getchar(); if('0'<=ch && ch<='9')v=v*10+ch-'0'; else{ assert(ch==nxt); break; } } return v*sgn; } const int mx=1e5+20; const int oo=1e9; int mxt=mx; int h[mx]; int o[mx]; int ft[mx]; int rht[mx];//rht[i]=min{ j : hj>hi } int f[mx];//f[i]=minimum number of reservoirs to provide water to hills i..n-1 void upd(int i,int v){ i=mxt-i-2; for(++i;i0;i-=(i&-i))a=min(a,ft[i]); return a; } int main(){ // freopen("secret/0.in","r",stdin); // freopen("secret/0.out","w",stdout); int t=rint('\n'); int sn=0; for(int tt=1;tt<=t;tt++){ int n=rint('\n'); assert(2<=n&&n<=1e5); mxt=n+10; for(int i=0;i1e9)cerr<<"wtf "<=0;i--){ rht[i]=qry(h[i]+1); upd(h[i],i); } // for(int i=0;i >s; stackst; for(int i=n-1;i>=0;i--){ f[i]=1+f[rht[i]];//place reservoir at i, pump to the right while(!st.empty() && h[i]>h[st.top()]){ int idx=st.top(); s.erase(make_pair(f[idx+1],idx)); st.pop(); } st.push(i); if(!s.empty()){ int bet=s.begin()->first+1; f[i]=min(f[i],bet); } s.insert(make_pair(f[i+1],i)); } printf("%d\n",f[0]); } cerr<<"sn="<