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 Java (OpenJDK 11.0.6) (judge verdict: Wrong Answer)

import java.util.Scanner;
 
public class Main {
 
	public static final MyScanner in = new MyScanner();

	public static int N;

	public static void main(String[] args) {

		N = in.nextInt();
		long sum1 = 0;
		long sum2 = 0;
		if (N % 2 == 0) {
			for(long i =0; i < N; i++) {
				long tmp = in.nextLong();
				if(i % 2==0) {
					sum1 += tmp; 
				}else {
					sum2 += tmp;
				}
			}
		}else {
			sum1 = solve(N);
		}
		


		System.out.println(sum1 > sum2 ? sum1 : sum2);

	}

	public static long[] A;
	public static long max;

	public static long solve(int N) {

		A = new long[N];
		for(int i=0;i<N;i++) A[i] = in.nextLong();

//		debug.add(0);
		int f = 0;
		s(A[f], f+0, f+0, 1);
		s(A[f], f+1, f+1, 1);
		s(A[f], f+2, f+2, 1);

		return max;
	}

//	public static LinkedList<Integer> debug = new LinkedList<>();


	public static void s(long n, int i, int step, int how) {
		i = i + 2;
		if(how > (N / 2)-1) {
			return;
		}
		if(how == (N / 2) -1) {
			for(int last=i;last<N;last++) {
//				debug.add(last);
				max = Math.max(max, n+A[last]);
//				System.out.println(debug);
//				debug.pollLast();
			}
			return;
		}
		for(int j=0;j+step<3;j++) {
//			debug.add(i+j);
			s(n+A[i], i+j, j+step, how+1);
//			debug.pollLast();
		}
	}


	public static class MyScanner {
		Scanner sc = new Scanner(System.in);
		String next() { return sc.next();}
		int nextInt() { return Integer.valueOf(sc.next());}
		long nextLong() { return Long.valueOf(sc.next()); }
	}
}