#include "bits/stdc++.h"
using namespace std;
////////////// Prewritten code follows. Look down for solution. ////////////////
#define fs first
#define sc second
#define pb push_back
#define len(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend
#define forn(i, n) for(int i = 0; i < (int)(n); ++i)
#define for1(i, n) for(int i = 1; i <= (int)(n); ++i)
#define ford(i, n) for(int i = (int)(n); i >= 0; --i)
#define fore(i, a, b) for(int i = (int)(a); i <= (int)(b); ++i)
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vpi;
typedef vector<vi> vvi;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef vector<ll> vl;
typedef vector<pll> vpl;
typedef vector<vl> vvl;
template<typename T> void maxself(T &a, T &b){a = max(a, b);};
template<typename T> void minself(T &a, T &b){a = min(a, b);};
const ll LINF = 1e18;
const int INF = 1e9;
const int MOD = 1e9+7;
/// command for char arrays with spaces -> scanf(" %[^\n]", text);
////////////////////////// Solution starts below. //////////////////////////////
const int N = 4e5+5;
int v[N];
struct Node{
int prefixSum;
int suffixSum;
int totalSum;
int maxSubArraySum;
Node(){
totalSum = 0;
prefixSum = suffixSum = maxSubArraySum = -INF;
}
};
Node seg[4*N];
Node mergeNodes(Node l, Node r){
Node ans;
ans.totalSum = l.totalSum + r.totalSum;
ans.prefixSum = max({0, l.prefixSum, l.totalSum + r.prefixSum});
ans.suffixSum = max({0, r.suffixSum, r.totalSum + l.suffixSum});
ans.maxSubArraySum = max({0, l.maxSubArraySum, r.maxSubArraySum, l.suffixSum + r.prefixSum, ans.prefixSum, ans.suffixSum, ans.totalSum});
return ans;
}
void build(int node, int l, int r){
if(l == r){
//folha
seg[node].totalSum = v[l];
seg[node].prefixSum = seg[node].suffixSum = seg[node].maxSubArraySum = max(0, v[l]);
}else{
int m = (l+r)>>1;
build(2*node+1, l, m);
build(2*node+2, m+1, r);
seg[node] = mergeNodes(seg[2*node+1], seg[2*node+2]);
}
}
Node query(int node, int l, int r, int ql, int qr){
if(qr < l or ql > r) return Node();
if(ql <= l and qr >= r) return seg[node];
int m = (l+r)>>1;
return mergeNodes(query(2*node+1, l, m, ql, qr), query(2*node+2, m+1, r, ql, qr));
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> v[i];
}
for(int i = n; i < 2*n; i++){
v[i] = v[i-n];
}
build(0, 0, 2*n-1);
Node ans = query(0, 0, 2*n-1, (n-1)>>1, (3*n-1)>>1);
cout << ans.maxSubArraySum << endl;
return 0;
}
I2luY2x1ZGUgImJpdHMvc3RkYysrLmgiCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLy8vLy8vLy8vLy8vLy8gUHJld3JpdHRlbiBjb2RlIGZvbGxvd3MuIExvb2sgZG93biBmb3Igc29sdXRpb24uIC8vLy8vLy8vLy8vLy8vLy8KCiNkZWZpbmUgZnMgZmlyc3QKI2RlZmluZSBzYyBzZWNvbmQKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBsZW4oeCkgKChpbnQpKHgpLnNpemUoKSkKI2RlZmluZSBhbGwoeCkgKHgpLmJlZ2luKCksICh4KS5lbmQoKQojZGVmaW5lIHJhbGwoeCkgKHgpLnJiZWdpbigpLCAoeCkucmVuZAojZGVmaW5lIGZvcm4oaSwgbikgZm9yKGludCBpID0gMDsgaSA8IChpbnQpKG4pOyArK2kpCiNkZWZpbmUgZm9yMShpLCBuKSBmb3IoaW50IGkgPSAxOyBpIDw9IChpbnQpKG4pOyArK2kpCiNkZWZpbmUgZm9yZChpLCBuKSBmb3IoaW50IGkgPSAoaW50KShuKTsgaSA+PSAwOyAtLWkpCiNkZWZpbmUgZm9yZShpLCBhLCBiKSBmb3IoaW50IGkgPSAoaW50KShhKTsgaSA8PSAoaW50KShiKTsgKytpKQoKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaWk7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPHBpaT4gdnBpOwp0eXBlZGVmIHZlY3Rvcjx2aT4gdnZpOwp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiBwYWlyPGxsLCBsbD4gcGxsOwp0eXBlZGVmIHZlY3RvcjxsbD4gdmw7CnR5cGVkZWYgdmVjdG9yPHBsbD4gdnBsOwp0eXBlZGVmIHZlY3Rvcjx2bD4gdnZsOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBtYXhzZWxmKFQgJmEsIFQgJmIpe2EgPSBtYXgoYSwgYik7fTsKdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBtaW5zZWxmKFQgJmEsIFQgJmIpe2EgPSBtaW4oYSwgYik7fTsKCmNvbnN0IGxsIExJTkYgPSAxZTE4Owpjb25zdCBpbnQgSU5GID0gMWU5Owpjb25zdCBpbnQgTU9EID0gMWU5Kzc7CgovLy8gY29tbWFuZCBmb3IgY2hhciBhcnJheXMgd2l0aCBzcGFjZXMgLT4gc2NhbmYoIiAlW15cbl0iLCB0ZXh0KTsKIAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTb2x1dGlvbiBzdGFydHMgYmVsb3cuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKY29uc3QgaW50IE4gPSA0ZTUrNTsKaW50IHZbTl07CgpzdHJ1Y3QgTm9kZXsKCWludCBwcmVmaXhTdW07CglpbnQgc3VmZml4U3VtOwoJaW50IHRvdGFsU3VtOwoJaW50IG1heFN1YkFycmF5U3VtOwoJTm9kZSgpewoJCXRvdGFsU3VtID0gMDsKCQlwcmVmaXhTdW0gPSBzdWZmaXhTdW0gPSBtYXhTdWJBcnJheVN1bSA9IC1JTkY7Cgl9Cn07CgpOb2RlIHNlZ1s0Kk5dOwoKTm9kZSBtZXJnZU5vZGVzKE5vZGUgbCwgTm9kZSByKXsKCU5vZGUgYW5zOwoJYW5zLnRvdGFsU3VtID0gbC50b3RhbFN1bSArIHIudG90YWxTdW07CglhbnMucHJlZml4U3VtID0gbWF4KHswLCBsLnByZWZpeFN1bSwgbC50b3RhbFN1bSArIHIucHJlZml4U3VtfSk7CglhbnMuc3VmZml4U3VtID0gbWF4KHswLCByLnN1ZmZpeFN1bSwgci50b3RhbFN1bSArIGwuc3VmZml4U3VtfSk7CglhbnMubWF4U3ViQXJyYXlTdW0gPSBtYXgoezAsIGwubWF4U3ViQXJyYXlTdW0sIHIubWF4U3ViQXJyYXlTdW0sIGwuc3VmZml4U3VtICsgci5wcmVmaXhTdW0sIGFucy5wcmVmaXhTdW0sIGFucy5zdWZmaXhTdW0sIGFucy50b3RhbFN1bX0pOwoJcmV0dXJuIGFuczsKfQoKdm9pZCBidWlsZChpbnQgbm9kZSwgaW50IGwsIGludCByKXsKCWlmKGwgPT0gcil7CgkJLy9mb2xoYQoJCXNlZ1tub2RlXS50b3RhbFN1bSA9IHZbbF07CgkJc2VnW25vZGVdLnByZWZpeFN1bSA9IHNlZ1tub2RlXS5zdWZmaXhTdW0gPSBzZWdbbm9kZV0ubWF4U3ViQXJyYXlTdW0gPSBtYXgoMCwgdltsXSk7Cgl9ZWxzZXsKCQlpbnQgbSA9IChsK3IpPj4xOwoJCWJ1aWxkKDIqbm9kZSsxLCBsLCBtKTsKCQlidWlsZCgyKm5vZGUrMiwgbSsxLCByKTsKCQlzZWdbbm9kZV0gPSBtZXJnZU5vZGVzKHNlZ1syKm5vZGUrMV0sIHNlZ1syKm5vZGUrMl0pOwoJfQp9CgpOb2RlIHF1ZXJ5KGludCBub2RlLCBpbnQgbCwgaW50IHIsIGludCBxbCwgaW50IHFyKXsKCWlmKHFyIDwgbCBvciBxbCA+IHIpIHJldHVybiBOb2RlKCk7CglpZihxbCA8PSBsIGFuZCBxciA+PSByKSByZXR1cm4gc2VnW25vZGVdOwoJaW50IG0gPSAobCtyKT4+MTsKCXJldHVybiBtZXJnZU5vZGVzKHF1ZXJ5KDIqbm9kZSsxLCBsLCBtLCBxbCwgcXIpLCBxdWVyeSgyKm5vZGUrMiwgbSsxLCByLCBxbCwgcXIpKTsKfQoKaW50IG1haW4oKXsKCglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgljaW4udGllKG51bGxwdHIpOwoKCWludCBuOwoJY2luID4+IG47Cglmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKCQljaW4gPj4gdltpXTsKCX0KCWZvcihpbnQgaSA9IG47IGkgPCAyKm47IGkrKyl7CgkJdltpXSA9IHZbaS1uXTsKCX0JCglidWlsZCgwLCAwLCAyKm4tMSk7CglOb2RlIGFucyA9IHF1ZXJ5KDAsIDAsIDIqbi0xLCAobi0xKT4+MSwgKDMqbi0xKT4+MSk7Cgljb3V0IDw8IGFucy5tYXhTdWJBcnJheVN1bSA8PCBlbmRsOwoJcmV0dXJuIDA7Cn0=