#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int num[100005];
int f[100005];
int g[100005];
int h[100005];
struct poj2593 {
/*[问题描述]:找出两个子段使得它们的和最大*/
/*[解题思路]:f[i]表示以第i个数结尾的最大子段和
* g[i]表示以第i个数开始的最大子段和
* h[i]=max{f[i],f[i-1],...,f[1]}=max{f[i],h[i-1]}
*/
int n;
void work() {
while (cin >> n) {
if (n == 0) break;
for (int i = 1; i <= n; i++)
cin >> num[i];
f[0] = 0;
h[0] = -1000;
for (int i = 1; i <= n; i++) {
f[i] = max(num[i], num[i] + f[i - 1]);
h[i] = max(f[i], h[i - 1]);
}
int S = -2000;
g[n + 1] = 0;
for (int i = n; i >= 1; i--) {
g[i] = max(num[i], num[i] + g[i + 1]);
S = max(S, g[i] + h[i - 1]);
}
cout << S << endl;
}
}
};
int main()
{
poj2593 solution;
solution.work();
return 0;
}