#include using namespace std; typedef long long ll; typedef long double ld; typedef pair ii; typedef vector vi; typedef vector vvi; typedef vector vii; #define x first #define y second #define pb push_back #define eb emplace_back #define rep(i,a,b) for(auto i=(a); i<(b); ++i) #define REP(i,n) rep(i,0,n) #define all(v) begin(v), end(v) #define sz(v) ((int) (v).size()) #define rs resize #define DBG(x) cerr << __LINE__ << ": " \ << #x<< " = " << (x) << endl template ostream& operator<<(ostream &os, const vector &v) { os << "\n["; for(const T &x : v) os << x << ','; return os << "]\n"; } namespace std { template struct hash> { public: size_t operator()(const pair &p) const { size_t x = hash()(p.x), y = hash()(p.y); return x ^ (y + 0x9e3779b9 + (x<<6) + (x>>2)); } }; } void run() { ll n; cin >> n; vii S(n); ll mi = 0; for (ll i = 0; i < n; i++) { cin >> S[i].x; S[i].y = i; if (S[i] > S[mi]) { mi = i; } } vii T(n+1); for (ll i = 0; i <= n; i++) { T[i] = S[(i+mi)%n]; T[i].y = (i+n-1)%n+1; } vi B(n+1, 0); vi C(n+1, 0); vi D = {0}; for (ll i = 1; i <= n; i++) { while (T[D[D.size()-1]] < T[i]) { C[D[D.size()-1]] = i; D.pop_back(); } B[i] = D[D.size()-1]; D.pb(i); } vi E(n+1, T[0].x); for (ll i = 1; i <= n; i++) { E[i] = E[i-1] + T[i].x; } vi A(n+1); A[0] = 0; A[n] = 0; vector> Q; for (ll i = 1; i < n; i++) { Q.pb({{-T[i].x, -T[i].y}, i}); } sort(all(Q)); for (pair q : Q) { ll i = q.y; ll s = E[C[i]-1] - E[B[i]]; A[i] = min(max(A[B[i]], T[B[i]].x - s), max(A[C[i]], T[C[i]].x - s)); } ll res = 1'000'000'000'000'000'000; for (ll i = 0; i < n; i++) { res = min(res, max(T[i].x, A[i])); } cout << res << endl; } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout << fixed << setprecision(20); run(); return 0; }