#pragma comment(linker, "/STACK:102400000,102400000") #include #include #include #define N 100005 #define M 200005 using namespace std; struct node { int v,id; }a[N]; struct node1 { int b[3]; }tr[N*4]; int Next[M],g[N],b[M],to[M],last[N],val[N],q[N*100],fa[N]; int ll,rr,si,s1,lgs,tot,i,j,k,l,s,m,n,sum,r,ss,t[N],V[N]; int e[N],vv[N],maa,mi,d[N],ma[N],vis[N],x,y,z,D; long long ans; inline void add(int o,int p) { Next[++tot]=last[o]; last[o]=tot; to[tot]=p; b[tot]=0; } inline void build(int o) { ll=0,rr=1; t[1]=o; lgs++; e[o]=lgs; while (ll>1; if (rr<=mid) return ask(o*2,l,mid,ll,rr,p); else if (ll>mid) return ask(o*2+1,mid+1,r,ll,rr,p); else { int gt=ask(o*2,l,mid,ll,mid,p); gt+=ask(o*2+1,mid+1,r,mid+1,rr,p); return gt; } } inline void up(int o) { tr[o].b[1]=tr[o*2].b[1]+tr[o*2+1].b[1]; tr[o].b[2]=tr[o*2].b[2]+tr[o*2+1].b[2]; } inline void change(int o,int l,int r,int ll,int rr,int p,int q) { if (l==ll&&r==rr) { tr[o].b[p]+=q; return ; } int mid=(l+r)>>1; if (rr<=mid) change(o*2,l,mid,ll,rr,p,q); else if (ll>mid) change(o*2+1,mid+1,r,ll,rr,p,q); else { change(o*2,l,mid,ll,mid,p,q); change(o*2+1,mid+1,r,mid+1,rr,p,q); } up(o); } inline int find(int o) { int l=0,r=tot,ww=0; while (l<=r) { int mid=(l+r)>>1; if (g[mid]<=o) ww=mid,l=mid+1; else r=mid-1; } return ww; } inline int find1(int o) { int l=0,r=tot,ww=0; while (l<=r) { int mid=(l+r)>>1; if (g[mid]>=o) ww=mid,r=mid-1; else l=mid+1; } return ww; } inline void dfs(int o) { int pp=maa,oo=mi;V[o]=1; maa=max(maa,a[o].v); mi=min(mi,a[o].v); if (g[maa]-g[mi]>D) ans+=si,ans++; else { ans+=s1; int yy=find(g[maa]-D-1); if (yy) ans+=ask(1,1,tot,1,yy,1); yy=find1(g[mi]+D+1); if (yy) ans+=ask(1,1,tot,yy,tot,2); } for (int i=last[o];i;i=Next[i]) { if (b[i]||V[to[i]]) continue; dfs(to[i]); } maa=pp,mi=oo;V[o]=0; } inline void work(int o) { int pp=maa,oo=mi;V[o]=1; maa=max(maa,a[o].v); mi=min(mi,a[o].v); si++; if (g[maa]-g[mi]>D) s1++; else { change(1,1,tot,maa,maa,2,1); change(1,1,tot,mi,mi,1,1); } for (int i=last[o];i;i=Next[i]) { if (b[i]||V[to[i]]) continue; work(to[i]); } maa=pp,mi=oo;V[o]=0; } inline void del(int o) { int pp=maa,oo=mi; V[o]=1; maa=max(maa,a[o].v); mi=min(mi,a[o].v); si--; if (g[maa]-g[mi]>D) s1--; else { change(1,1,tot,maa,maa,2,-1); change(1,1,tot,mi,mi,1,-1); } for (int i=last[o];i;i=Next[i]) { if (b[i]||V[to[i]]) continue; del(to[i]); } maa=pp,mi=oo; V[o]=0; } inline int geth() { for (int i=1;i<=rr;i++) ma[t[i]]=0,d[t[i]]=0; int uu=n,st=0; for (int i=rr;i;i--) { d[t[i]]++,d[fa[t[i]]]+=d[t[i]]; ma[fa[t[i]]]=max(ma[fa[t[i]]],d[t[i]]); ma[t[i]]=max(rr-d[t[i]],ma[t[i]]); if (ma[t[i]]='0')&&(ch<='9'))||(ch=='-'))); if(ch!='-')a*=10,a+=ch-'0';else f=true; while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0'; if(f)a=-a; return a; } inline bool cmp(node x,node y) { return x.v