#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<iostream>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
typedef long long LL;
const int N=1e5+10,mod=1e6;
const int MAX = 1e8 + 10 ;
/*直接两次遍历的话肯定是会超过时间的,
典型的动态规划;
子状态:
1.取a[i] ,dp[i] = dp[i-1] + a[i] ;
2.不取a[i] , 因为要求连续的序列所以新的值就是a[i] ;
所以转移方程:
dp[i] = max(dp[i-1] + a[i] , a[i]) ;
*/
LL a[1000010]; //记录输入的值
LL dp[1000100] ; //动态规划的方程
LL max(LL n , LL m){
return n > m ? n : m ;
}
int main(){
int n ;
while(cin >> n){
for(int i = 1 ; i <= n ; i++){
cin >> a[i] ;
}
LL Max ;
for(int i = 1 ; i <= n ; i++){
dp[i] = max(dp[i-1] + a[i] , a[i]) ;
if(i == 1){
Max = dp[1] ;
}
if(dp[i] > Max ) {
Max = dp[i] ;
}
}
/*不懂的同学可以把这个加上试试
for(int i = 1 ; i <= n ; i++){
cout << dp[i] << ' ' ;
}
cout <<endl; */
cout << Max <<endl;
}
}