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

#include<bits/stdc++.h>
#define ll long long
#define inf 100000000000000000ll
using namespace std;
int n;
ll mem[200005][3], ara[200005];
bool vis[200005][3];
ll dp(int pos, int skip)
{
    if(pos>=n || (pos==n-1 && skip==2))return 0;
    if(vis[pos][skip])return mem[pos][skip];
    vis[pos][skip]= 1;
    mem[pos][skip]= -inf;
    if(skip)mem[pos][skip]= dp(pos+1, skip-1);
    mem[pos][skip]= max(mem[pos][skip], ara[pos]+dp(pos+2, skip));
    return mem[pos][skip];
}
int main()
{
    scanf("%d", &n);
    for(int i=0; i<n; i++)scanf("%lld", &ara[i]);
    ll res= -inf;
    if(!(n&1))
    {
        //memset(vis, 0, sizeof vis);
        res= max(res, ara[0]+dp(2, 1));
        //memset(vis, 0, sizeof vis);
        res= max(res, ara[1]+dp(3, 0));
    }
    else
    {
        //memset(vis, 0, sizeof vis);
        res= max(res, ara[0]+dp(2, 2));
        //memset(vis, 0, sizeof vis);
        res= max(res, ara[1]+dp(3, 1));
        //memset(vis, 0, sizeof vis);
        res= max(res, ara[2]+dp(4, 0));
    }
    printf("%lld\n", res);
    return 0;
}