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 rep(i,n) for(int i=0;i<n;i++)
#define repr(i,n) for(int i=n-1;i>=0;i--)
#define MAX(a,b) a=a>b?a:b
#define MIN(a,b) a=a<b?a:b
#define REP(i,x,n) for(int i=x;i<n;i++)
#define REPR(i,x,n) for(int i=n-1;i>=x;i--)
#define pb  push_back
#define ALL(obj) (obj).begin(), (obj).end()
#define ALLr(obj) (obj).rbegin(), (obj).rend()
#define endl "\n"
#define F first
#define S second
#define EN cout<<endl;
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const ll MOD = 1e9 + 7;


ll gcd(unsigned a, unsigned b) {

  if(a < b) return gcd(b, a);
  unsigned r;
  while ((r=a%b)) {
    a = b;
    b = r;
  }
  return b;
}

int main() {
    int n, k;
    cin>>n;
    
    ll a[202020],ans,ans2;
    ll r[2][202020]={};
    cin>>a[0]>>a[1];
    r[0][0]=a[0];r[1][0]=a[1];
    REP(i,2,n){
        cin>>a[i];
        r[i%2][i/2]=a[i]+r[i%2][i/2 -1];
    }
    if(n%2==0){
        ans=r[1][n/2 -1];
        rep(i,n/2){
            MAX(ans,r[0][i]+r[1][n/2 -1]-r[1][i]);
            
        }
        cout<<ans;
    }
    else{
        ans=r[1][n/2 -1];
        ans2=a[0];
        ans=max(ans,r[0][n/2]-a[0]);
        REP(i,1,n/2+1){
            ans=max(ans,r[0][n/2]-a[i*2]);
            ans=max(ans,r[1][i-1]+r[0][n/2]-r[0][i]);
            if(i>=2){
              ans2=max(ans2+a[i*2-1],r[0][i-2]+a[i*2-1]);
              ans=max(ans,ans2+r[1][n/2-1]-r[1][i -1]);
              ans=max(ans,ans2+r[0][n/2]-r[0][i]);
            }
        }
        
        
        cout<<ans;
    }
    EN;
}