/*
* Problem :: 13398 / 연속합 2
*
* Kind :: Dynamic Programming + Prefix Sum
*
* Insight
* - 누적합인데...
* 숫자하나를 뺄 수 있네?
* + |-------------|
* A. --------------> // Left to Right
* B. <-------------- // Right to Left
* C. ----->X<------- // Left to Right + Right to Left
* 위와 같은 방법으로 각각의 경우를 고려해주자
* Point
* - N=1 일때 조심하자
* + C 방법을 이때 사용하면
* 수를 하나도 선택하지 않는 경우가 되어서
* 0 과 같은 값으로 초기화 된 경우 오답이 나올 수 있다
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N; cin >> N;
int A[N];
for (int i=0; i<N; i++)
cin >> A[i];
// Process
int l2r[N], r2l[N];
memset(l2r, 0, sizeof(l2r));
memset(r2l, 0, sizeof(r2l));
/* Prefix Sum - Left to Right */
l2r[0] = A[0];
for (int i=1; i<N; i++) {
l2r[i] = A[i] + ((l2r[i-1] < 0) ? 0 : l2r[i-1]);
}
/* Prefix Sum - Right to Left */
r2l[N-1] = A[N-1];
for (int i=N-2; i>=0; i--) {
r2l[i] = A[i] + ((r2l[i+1] < 0) ? 0 : r2l[i+1]);
}
/* A, B 방법으로 max */
int ans = max(*max_element(l2r, l2r+N), *max_element(r2l, r2l+N));
/* C 방법으로 max */
if (N > 1) {
for (int i=0; i<N; i++) {
if (i == 0) {
ans = max(ans, r2l[1]); /* N=1 일 때, 인덱스 오류 */
} else if (i == N-1) {
ans = max(ans, l2r[N-2]);
} else {
ans = max(ans, l2r[i-1]+r2l[i+1]);
}
}
}
// Control : Output
cout << ans << endl;
}
// Helper Functions
/* None */