Problem:
Score : 600 points

Problem Statement

Given is an integer sequence A_1, ..., A_N of length N.

We will choose exactly \left\lfloor \frac{N}{2} \right\rfloor elements from this sequence so that no two adjacent elements are chosen.

Find the maximum possible sum of the chosen elements.

Here \lfloor x \rfloor denotes the greatest integer not greater than x.

Constraints

2 \leq N \leq 2\times 10^5

|A_i|\leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 ... A_N

Output

Print the maximum possible sum of the chosen elements.

Sample Input 1

6
1 2 3 4 5 6

Sample Output 1

12

Choosing 2, 4, and 6 makes the sum 12, which is the maximum possible value.

Sample Input 2

5
-1000 -100 -10 0 10

Sample Output 2

0

Choosing -10 and 10 makes the sum 0, which is the maximum possible value.

Sample Input 3

10
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000

Sample Output 3

5000000000

Watch out for overflow.

Sample Input 4

27
18 -28 18 28 -45 90 -45 23 -53 60 28 -74 -71 35 -26 -62 49 -77 57 24 -70 -93 69 -99 59 57 -49

Sample Output 4

295

Solution in C# (Mono-mcs 6.8.0.105) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		int N = int.Parse(Console.ReadLine());
		string[] str = Console.ReadLine().Split();
		long[]A = new long[N];
		long[,]D = new long[N,3];
		for(var i=0;i<N;i++){
			A[i] = long.Parse(str[i]);
		}
		D[N-1,0] = A[N-1];
		D[N-2,1] = A[N-2];
		if(N>=3){
			D[N-3,2] = A[N-3];
		}
		for(var i=N-2;i>=0;i--){
			if((N-1-i)%2==0){
				D[i,0] = D[i+2,0] + A[i];
			}
			if((N-2-i)%2==0 && i+2<N){
				D[i,1] = D[i+2,1]+A[i];
				if(i+3<N){
					D[i,1] = Math.Max(D[i,1],D[i+3,0]+A[i]);
				}
			}
			if((N-3-i)%2==0){
				D[i,2] = D[i+2,2]+A[i];
				if(i+3<N){
					D[i,2] = Math.Max(D[i,2],D[i+3,1]+A[i]);
				}
				if(i+4<N){
					D[i,2] = Math.Max(D[i,2],D[i+4,0]+A[i]);
				}
			}
		}
		long ans = 0;
		ans = D[N+1-N/2*2,0];
		ans = Math.Max(ans,D[N-N/2*2,1]);
		if(N-1-N/2*2 >= 0){
			ans = Math.Max(ans,D[N-1-N/2*2,2]);
		}
      for(var h=0;h<3;h++){
		for(var i=0;i<N;i++){
        }
        }
		Console.WriteLine(ans);
	}
}