#include<cstdio>
#define nmax 100005
int a[nmax],arb[4*nmax+50],val[4*nmax+50],d[4*nmax+50];
int pos,v,l,start,finish,dd;
void update(int nod,int left,int right)
{
if(left == right)
{
arb[nod]=l;
val[nod]=v;
return ;
}
int div=(left+right)/2;
if(pos<=div)update(2*nod,left,div);
else update(2*nod+1,div+1,right);
if(arb[2*nod]>arb[2*nod+1]){ arb[nod]=arb[2*nod]; val[nod]=val[2*nod]; }
else { arb[nod]=arb[2*nod+1]; val[nod]=val[2*nod+1]; }
}
void query(int nod,int left,int right)
{
if(left == right){
if(arb[nod]>l && val[nod]>v){ l=arb[nod]; dd=nod; }
return ;
}
int div=(left+right)/2;
if(left == pos && arb[nod]>l && val[nod]>v){ l=arb[nod]; dd=nod; return ; }
if(pos<=div){
query(2*nod,left,div);
if(arb[2*nod+1]>l){
if(val[2*nod+1]>v){ l=arb[2*nod+1]; return ; }
else query(2*nod+1,div+1,right);
}
}
else query(2*nod+1,div+1,right);
}
/*void scrie(int nod,int left,int right){
if(left == right){
v=val[nod];
return ;
}
int div=(left+right)/2;
if(arb[2*nod]==arb[nod])scrie(2*nod,left,div);
else scrie(2*nod+1,div+1,right);
if(val[d[nod]]>v){ printf("%d ",v); v=val[d[nod]]; }
}*/
int main(void){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,i,j;
scanf("%d\n",&n);
for(i=1;i<=n;++i)scanf("%d ",&a[i]);
l=1; v=a[n]; pos=n;
update(1,1,n);
for(i=n-1;i>=1;--i){
l=0; v=a[i]; pos=i+1; start=pos+1; finish=n; dd=0;
query(1,1,n);
d[i]=dd;
l++; pos--; start=pos;
update(1,1,n);
}
printf("%d\n",arb[1]);
/* scrie(1,1,n);*/
return 0;
}