Problem:
Maximum Sum Sequence

Given a sequence of numbers a1, a2, a3, ..., an, find the maximum sum of a contiguous subsequence of those numbers. Note that, a subsequence of one element is also a contiquous subsequence.

Input

The input consists of multiple datasets. Each data set consists of:

n
a1
a2
.
.
an

You can assume that 1 ≤ n ≤ 5000 and -100000 ≤ ai ≤ 100000.

The input end with a line consisting of a single 0.

Output

For each dataset, print the maximum sum in a line.

Sample Input

7
-5
-1
6
4
9
-6
-7
13
1
2
3
2
-2
-1
1
2
3
2
1
-2
1
3
1000
-200
201
0

Output for the Sample Input

19
14
1001

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

class AIZU0022
   {
   public static int par() { string s = Console.ReadLine() ; return int.Parse(s); }
   public static HashSet<int> Mount=new HashSet<int>(), Valley=new HashSet<int>();
   public static List<int> M=new List<int>();  //register the sum from first to n-th
   public static void Main(string[] args) {
      int N;
      int k,kp=0;
      while (true) {
         N=par();
         if (N<=0) break;
         M.Clear();  Mount.Clear(); Valley.Clear();
         kp=0;
         for (int i = 0; i<N; i++) {
            k=par(); M.Add((i>0?M.Last():0)+k);
            if (kp<=0 && k>0 && i!=0&&i!=N-1) Valley.Add(i-1);
            if (kp>=0 && k<0 && i!=0&&i!=N-1) Mount.Add(i-1);
            kp=k;
         }
         Console.WriteLine(Sup());
      }
   }

   public static int Sup() { 
      //versus First
      int Max = M.Max();
      //versus Last
      int beta;
      if (M.Last()>=0) {
         beta=M.Last()-M.Min();
         if (beta>Max) Max=beta;
      }
      if (Mount.Count==0) {
         List<int> m = new List<int>() { M[0] };
         for (int i = 1; i<M.Count; i++) {
            m.Add(M[i]-M[i-1]);
         }
         beta=m.Max();
         if (beta>Max) Max=beta;
      }
      foreach (int st in Valley) {
         IEnumerable<int> G = Mount.Where(i => i>st);
         foreach (int g in G) {
            beta=M[g]-M[st];
            if (beta>Max) Max=beta;
         }
      }
      return Max;
   }
}