#include using namespace std; //template int size(const T &x) { return x.size(); } #define rep(i,a,b) for (auto i=(a); i<(b); ++i) #define iter(it,c) for (auto it = (c).begin(); it != (c).end(); ++it) typedef pair ii; typedef vector vi; typedef vector vii; typedef vector vvi; typedef long long ll; const int INF = 2147483647; const ll DINF = 9000000000000000000; int L[500000], R[500000]; bool comp[500000]; ll mem[500000]; int n; vector arr, sm; ll dp(int at) { if (L[at] == -1 && R[at] == n) { return 0; } if (comp[at]) { return mem[at]; } ll have = sm[R[at]-1]; if (L[at] != -1) { have -= sm[L[at]]; } ll mn = DINF; if (L[at] != -1) { mn = min(mn, max(arr[L[at]]-have, dp(L[at]))); } if (R[at] != n) { mn = min(mn, max(arr[R[at]]-have, dp(R[at]))); } comp[at] = true; return mem[at] = mn; } int main() { ios_base::sync_with_stdio(false); cin >> n; arr = vector(n); rep(i,0,n) { cin >> arr[i]; } rotate(arr.begin(), max_element(arr.begin(), arr.end()), arr.end()); rep(i,0,n) { sm.push_back(arr[i]); if (i > 0) { sm[i] += sm[i-1]; } } stack S; rep(i,0,n) { while (!S.empty() && arr[S.top()] <= arr[i]) { S.pop(); } L[i] = S.empty() ? -1 : S.top(); S.push(i); } while (!S.empty()) S.pop(); for (int i = n-1; i >= 0; i--) { while (!S.empty() && arr[S.top()] <= arr[i]) { S.pop(); } R[i] = S.empty() ? n : S.top(); S.push(i); } ll mn = DINF; rep(i,0,n) { mn = min(mn, max(arr[i], dp(i))); } cout << mn << endl; return 0; }