#include <bits/stdc++.h>
using namespace std;
const int MAX = 2e5 + 5;
int n;
pair<int, int> a[MAX];
struct par {
  int a, b;
  par(int a, int b) : a(a), b(b) {}
  bool operator<(const par &p) const { return b < p.b; }
};
multiset<par> s;
multiset<int> sizes;
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i].first);
    a[i].second = i;
  }
  sort(a + 1, a + n + 1);
  int best = 1, opt = a[n].first + 1;
  for (int i = 1; i <= n; i++) {
    if (!sizes.empty()) {
      auto x = sizes.begin();
      auto y = sizes.rbegin();
      int v = a[i - 1].first + 1;
      if (*x == *y) {
        if ((int)sizes.size() > best) {
          best = sizes.size();
          opt = v;
        } else if ((int)sizes.size() == best && a[i].first < opt)
          opt = v;
      }
    }
    auto u = s.upper_bound(par(0, a[i].second));
    par intervalo = par(a[i].second, a[i].second);
    vector<par> del;
    if (u != s.end()) {
      auto o = *u;
      if (o.a - 1 == a[i].second) {
        del.push_back(o);
        intervalo.b = o.b;
      }
    }
    if (u != s.begin()) {
      u--;
      auto o = *u;
      if (o.b + 1 == a[i].second) {
        del.push_back(o);
        intervalo.a = o.a;
      }
    }
    for (auto o : del) {
      s.erase(s.find(o));
      int sz = o.b - o.a + 1;
      sizes.erase(sizes.find(sz));
    }
    s.insert(intervalo);
    sizes.insert(intervalo.b - intervalo.a + 1);
  }
  printf("%d\n", opt);
  return 0;
}
