#include<iostream>
using namespace std;
const int MAXN = 1e5;
int MaxSubseqSum1(int a[], int n){
int ThisSum, MaxSum = 0;
for(int i = 0; i < n; i++){
for(int j = i; j < n; j++){
ThisSum = 0;
for(int k = i; k <= j; k++){
ThisSum += a[k];
}
if(ThisSum > MaxSum){
MaxSum = ThisSum;
}
}
}
return MaxSum;
}
int MaxSubseqSum2(int a[], int n){
int ThisSum, MaxSum = 0;
for(int i = 0; i < n; i++){
for(int j = i; j < n; j++){
ThisSum += a[j];
if(ThisSum > MaxSum){
MaxSum = ThisSum;
}
}
}
return MaxSum;
}
int Max3 ( int A, int B, int C ) {
return (A > B) ? (A > C ? A : C) : (B > C ? B : C);
}
int DivideAndConquer ( int List[], int left, int right ) {
int MaxLeftSum, MaxRightSum;
int MaxLeftBorderSum, MaxRightBorderSum;
int LeftBorderSum, RightBorderSum;
int center, i;
if ( left == right ) {
if ( List[left] > 0 ) return List[left];
else return 0;
}
center = ( left + right ) / 2;
MaxLeftSum = DivideAndConquer ( List, left, center );
MaxRightSum = DivideAndConquer ( List, center+1, right );
MaxLeftBorderSum = 0; LeftBorderSum = 0;
for ( i = center; i >= left; i-- ) {
LeftBorderSum += List[i];
if ( LeftBorderSum > MaxLeftBorderSum )
MaxLeftBorderSum = LeftBorderSum;
}
MaxRightBorderSum = 0; RightBorderSum = 0;
for ( i = center+1; i <= right; i++ ) {
RightBorderSum += List[i];
if ( RightBorderSum > MaxRightBorderSum )
MaxRightBorderSum = RightBorderSum;
}
return Max3 ( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum );
}
int MaxSubseqSum3 ( int List[], int N ) {
return DivideAndConquer ( List, 0, N-1 );
}
int MaxSubseqSum4(int a[], int n){
int ThisSum = 0, MaxSum = 0;
for(int i = 0; i < n; i++){
ThisSum += a[i];
if(ThisSum > MaxSum)
MaxSum = ThisSum;
else if(ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
int main(){
int k, a[MAXN];
cin >> k;
for(int i = 0; i < k; i++){
cin >> a[i];
}
cout << MaxSubseqSum4(a, k) <<endl;
return 0;
}