import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		long a[]=new long[n];
		for (int i = 0; i < a.length; i++) {
			a[i]=scanner.nextLong();
		}
		long dp[]=new long[n+5];
		//dp[i]表示以a[i]结尾的最大子数组和
		dp[1]=a[0];
		long max=a[0];
		for (int i = 2; i <= n; i++) {
			//要么自成一派,要么加入组织
			dp[i]=Math.max(a[i-1], dp[i-1]+a[i-1]);
			if(dp[i]>max)max=dp[i];
		}
		System.out.println(max);
		

	}

}

把dp[i]设置为以a[i]结尾的最大子段和,那么当考虑a[i]时,要么独自成一组,要么加入之前的子段,如果之前的子段和是正数,那么一般就加入,如果是负数,那么独自一组