//最大子段和 //分治法
#include<iostream>
#include<algorithm>
#define N 100
using namespace std;
int max(int A,int B,int C){
return A > B?(A > C? A : C):(B > C? B : C);
}
int maxsum(int num[],int left,int right){
//递归终止条件
if(left == right){
if(num[left] > 0) return num[left];
else return 0;
}
int leftline = 0,maxleftline = 0,rightline = 0,maxrightline = 0;//设置分界线左右的变量
int center = (left + right)/2;
for(int i = center;i >= left;i--){
leftline += num[i];
if(maxleftline < leftline) maxleftline = leftline;
}//向左扫描
for(int j = center+1;j <= right;j++){
rightline += num[j];
if(maxrightline < rightline) maxrightline = rightline;
}//向右扫描
int maxleft = 0,maxright = 0;
maxleft = maxsum(num,left,center);
maxright = maxsum(num,center+1,right);
return max(maxleft,maxright,maxleftline+maxrightline);
}
int main(){
int n;
cin >> n;
int num[n] = {0};
for(int i = 0;i < n;i++){
cin >> num[i];
}
int result;
result = maxsum(num, 0 , n - 1);
cout << result;
return 0;
}