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++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define int long long
using std::max;
const int MAXN=200005;
int n,i,x,y,z,a[MAXN],f[MAXN][3];
inline void read(int &x)
{
	short negative=1;
    x=0;
    char c=getchar();
    while(c<'0' || c>'9')
    {
    	if(c=='-')
			negative=-1;
		c=getchar();
	}
    while(c>='0' && c<='9')
        x=(x<<3)+(x<<1)+(c^48),c=getchar();
    x*=negative;
}
inline void print(int x)
{
    if (x<0)
        putchar('-'),x=-x;
    if (x>9)
        print(x/10);
    putchar(x%10+'0');
}
signed main(void)
{
	read(n);
	for (i=1;i<=n;i++)
		read(a[i]);
	if (!(n%2))
	{
		f[1][0]=a[1];
		for (i=2;i<=n;i++)
			if (i%2)
				f[i][0]=f[i-2][0]+a[i];
			else
			{
				if (i>=3)
					f[i][1]=max(f[i-2][1],f[i-3][0])+a[i];
				else
					f[i][1]=f[i-2][1]+a[i];
			}
		return print(max(f[n-1][0],f[n][1])),0;
	}
	f[1][0]=a[1];
	for (i=2;i<=n;i++)
		if (i%2)
		{
			f[i][0]=f[i-2][0]+a[i];
			if (i>=4)
				f[i][2]=max(f[i-2][2],max(f[i-3][1],f[i-4][0]))+a[i];
			else
			{
				if (i>=3)
					f[i][2]=max(f[i-2][2],f[i-3][1])+a[i];
				else
					f[i][2]=f[i-2][2]+a[i];
			}
		}
		else
		{
			if (i>=3)
				f[i][1]=max(f[i-2][1],f[i-3][0])+a[i]; 
			else
				f[i][1]=f[i-2][1]+a[i];
		}
	print(max(f[n][2],max(f[n-1][1],f[n-2][0])));
	return 0;
}