#include<bits/stdc++.h>
using namespace std;

using ll=long long;
using ull=unsigned long long;
using i128=__int128_t;
using u128=__uint128_t;
using ld=long double;

void solve()
{//设dp[n]为以第n个元素为结尾能够取到的最大子段和 对于dp[n] 我们假设已经知道dp[n-1]的大小 然后我们只需要知道 dp[n-1]加上第n个元素和第n个元素本身谁大即可 从而得出dp[n]
    ll n,MAX=-2e10;
    cin >> n;
    vector<ll>v(n+1,0),dp(n+1,0);
    for(int i=1;i<=n;i++) cin >> v[i];
    dp[1]=v[1];
    for(int i=2;i<=n;i++)
    {
        dp[i]=max(v[i],v[i]+dp[i-1]);//状态转移方程
        MAX=max(MAX,dp[i]);//记得存储最大值
    }
    cout << MAX;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t=1;
	//cin >> t;
	
	while(t--)
	{
		solve();
	}
	return 0;
}