#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,x,y,z) for(long long i=x;i<=y;i+=z)
#define fd(i,x,y,z) for(long long i=x;i>=y;i-=z)
ll n;
ll a[2000005];
ll ans=0;
struct Node{
ll l,r,mx,mn,mxk,mnk;
}t[8000005];
Node nmm;
void pushup(ll now){
t[now].mx=max(t[now<<1].mx,t[now<<1|1].mx);
t[now].mn=min(t[now<<1].mn,t[now<<1|1].mn);
if(t[now<<1].mx<t[now<<1|1].mx){
t[now].mxk=t[now<<1|1].mxk;
}
else if(t[now<<1].mx>t[now<<1|1].mx){
t[now].mxk=t[now<<1].mxk;
}
else if(t[now<<1].mx==t[now<<1|1].mx){
t[now].mxk=min(t[now<<1].mxk,t[now<<1|1].mxk);
}
if(t[now<<1].mn<t[now<<1|1].mn){
t[now].mnk=t[now<<1].mnk;
}
else if(t[now<<1].mn>t[now<<1|1].mn){
t[now].mnk=t[now<<1|1].mnk;
}
else if(t[now<<1].mn==t[now<<1|1].mn){
t[now].mnk=max(t[now<<1].mnk,t[now<<1|1].mnk);
}
}
void build(ll now,ll l,ll r){
t[now].l=l,t[now].r=r;
if(l==r){
t[now].mx=t[now].mn=a[l];
t[now].mxk=t[now].mnk=l;
return;
}
ll mid=(l+r)>>1;
build(now<<1,l,mid);
build(now<<1|1,mid+1,r);
pushup(now);
}
Node query(ll now,ll l,ll r){
if(l>r){
return nmm;
}
if(t[now].l>=l&&t[now].r<=r){
return t[now];
}
Node tot={0,0,0,0,0,0};
ll mid=(t[now].l+t[now].r)>>1;
if(l<=mid){
Node _=query(now<<1,l,r);
tot=_;
}
if(r>mid){
Node _=query(now<<1,l,r);
if(tot.mx<_.mx){
tot.mx=_.mx;
tot.mxk=_.mxk;
}
else if(tot.mx==_.mx){
tot.mxk=min(tot.mxk,_.mxk);
}
if(tot.mn>_.mn){
tot.mn=_.mn;
tot.mnk=_.mnk;
}
else if(tot.mn==_.mn){
tot.mnk=max(tot.mnk,_.mnk);
}
}
return tot;
}
void solve(ll l,ll r){
if(l>=r||l<0||r<0){
return;
}
Node x=query(1,l,r);
Node y=query(1,l,x.mxk);
if(x.mxk!=y.mnk){
ans=max(ans,x.mxk-y.mnk+1);
}
solve(l,y.mnk-1);
solve(x.mxk+1,r);
}
int main(){
scanf("%lld",&n);
f(i,1,n,1){
scanf("%lld",&a[i]);
}
build(1,1,n);
solve(1,n);
printf("%lld\n",ans);
return 0;
}
用线段树写的,怎么都RE/kk