用并查集和multiset维护序列长度
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct P{
int pos,v;
}p[N];
int n;
int a[N];
int f[N],size[N];
set<int> q;
set<int>::iterator qq;
multiset<int> s;
multiset<int>::iterator ss;
int mx=0;
int ans=0;
bool cmp(P x,P y){
return x.v<y.v;
}
int find(int x){
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
void he(int x,int y){
x=find(x);
y=find(y);
if(x==y) return;
s.erase(s.find(size[x]));
s.erase(s.find(size[y]));
f[x]=y;
size[y]+=size[x];
s.insert(size[y]);
}
int main(){
//freopen("in.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
q.insert(a[i]);
p[i].pos=i;
p[i].v=a[i];
}
sort(p+1,p+1+n,cmp);
for(int i=1;i<=n;i++){
f[i]=i;
size[i]=1;
}
int i=1;
while(q.size()){
qq=q.begin();
int cnt=*qq;q.erase(qq);
s.insert(1);
while(i<=n&&p[i].v<=cnt){
if(p[i].pos>1&&a[p[i].pos-1]<=a[p[i].pos])
he(p[i].pos-1,p[i].pos);
if(p[i].pos<n&&a[p[i].pos+1]<=a[p[i].pos])
he(p[i].pos,p[i].pos+1);
i++;
}
ss=s.begin();
int g=*ss;
ss=s.end();ss--;
int h=*ss;
if(h==g){
if(s.size()>mx){
mx=s.size();
ans=cnt+1;
}
}
}
printf("%d\n",ans);
return 0;
}