#include <iostream>
#include<math.h>
using namespace std;
//这是用于求出最大左右子串的和
int Acrossingsubarray(int a[], int low, int mid, int high)
{
int Sleft = -19260817;
int Sright = -19260817;
int sum = 0;
int S=0;
for (int i = mid; i >=low; i--) {
sum = sum + a[i];
Sleft = max(Sleft, sum);
} //左子串最大
sum = 0;
for (int i = mid + 1; i <= high; i++) {
sum += a[i];
Sright = max(Sleft, sum);
}//右字串最大
S = Sleft + Sright;
return S;
}
//分治递归求解
int Maxsubarray(int a[], int low, int high)
{
int mid;
int S1,S2, S3;
int Smax;
if (low == high) {
return a[low] ;
}//low=right直接返回这个值
else {
mid = (low + high) / 2;
S3 = Acrossingsubarray(a, low, mid, high);
S1 = Maxsubarray(a, low, mid);
S2 = Maxsubarray(a, mid + 1, high);
Smax = max(max(S1, S2), S3);
return Smax;
}
}
int main()
{
int A[100000];
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> A[i];
}
int t = Maxsubarray(A, 0, n-1);
cout << t;
return 0;
}