using System;
using System.Collections.Generic;
using System.Linq;
public class Program {
public static void Main() {
int.TryParse(Console.ReadLine(), out int n);
long[] nums = Console.ReadLine().Split(' ').Select(long.Parse).ToArray();
Console.WriteLine(CaculateMaxSubArry(nums));
}
public static long CaculateMaxSubArry(long[] inputs) {
long maxSoFar = inputs[0];
List<long> dp = new List<long>();
//先把dp填满,此时每个dp[i]表示以inputs[i]结尾的最大子数组和的最差情况
for(int i = 0; i < inputs.Length; i++)
{
dp.Add(inputs[i]);
}
for (int i = 1; i < inputs.Length; i++)
{
//以input[i]结尾的最大子数组和,要么是input[i]本身(相当于开启一个新的子数组),要么是input[i]加上以input[i-1]结尾的最大子数组和(相当于延续之前的子数组)
long lastCaculation = dp[i-1];
dp[i] = Math.Max(inputs[i], lastCaculation + inputs[i]);
// dp[i] = lastCaculation + inputs[i];
maxSoFar = Math.Max(maxSoFar, dp[i]);
}
return maxSoFar;
}
}