#include<iostream>
#include<algorithm>
using namespace std;
int zuichangziduan(int* s, int* e)//s时子段开始,e是子段结束
{
if (s == e)
{
return *s;//子段中只有一个数时返回该数
}
int ansL;
int ansR;
int ans;
int* s_ = s + (e - s - 1) / 2, * s__ = s_ - 1;
int* e_ = s_ + 1, * e__ = e_ + 1;//s_和e_将子段再次划分,s__与e__作为求跨两段的最大子段和的迭代器
int alr_ = 0, alr = 0;
alr = alr_ = *s_ + *e_;
while(s__ >= s)
{
alr += *s__;
if (alr > alr_)
{
alr_ = alr;
}
s__--;
}
alr = alr_;
while (e__ <= e)
{
alr += *e__;
if (alr > alr_)
{
alr_ = alr;
}
e__++;
}
ansL = zuichangziduan(s, s_);//递归
ansR = zuichangziduan(e_, e);
ans = max(ansL, max(ansR, alr_));
return ans;
}
int main()
{
int arr[20000] = { 0 };
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
int ma = zuichangziduan(arr, arr + n - 1);
cout << ma << endl;
}