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: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << " : " << arg1 << "\n";
}
template <typename Arg1, typename... Args>
void __f(const char* na, Arg1&& arg1, Args&&... args) {
  const char* c = strchr(na + 1, ',');
  cerr.write(na, c - na) << " : " << arg1 << " , ";
  __f(c + 1, args...);
}
#define endl "\n"
#define all(v) v.begin(), v.end()
#define UNIQUE(v) sort(all(v)),v.erase(unique(all(v)),v.end())
typedef long long LL;
typedef pair <int,int> pii;
const double pi = acos(-1.0);
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int inf = 1e9;
const LL INF = 1e18;
const int N = 2e5 + 5;

LL a[ N ];
LL dp1[ N ][ 5 ], dp2[ N ][ 5 ][ 5 ];
int n;

LL solve1(int idx, int sk) {
  if (sk > 1) return -INF;
  if (idx > n) return 0;
  if (dp1[idx][sk] != -1) return dp1[idx][sk];
  LL ret = -INF;
  if (sk) ret = max(ret, solve1(idx + 1, 0) + a[idx]);
  else ret = max(ret, solve1(idx + 1, 1));
  return dp1[idx][sk] = ret;
}
LL solve2(int idx, int sk, int done) {
  if (done > 1) return -INF;
  if (sk > 2) return -INF;
  if (idx > n) return done == 1 ? 0 : -INF;
  if (dp2[idx][sk][done] != -1) return dp2[idx][sk][done];
  LL ret = -INF;
  ret = max(ret, solve2(idx + 2, sk, done) + a[idx]);
  ret = max(ret, solve2(idx + 1, sk + 1, (sk + 1 > 1) ? done + 1: done));
  return dp2[idx][sk][done] = ret;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  #ifdef LOCAL
    freopen("input.txt", "r", stdin);
  #endif // LOCAL
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  memset(dp1, -1, sizeof(dp1));
  memset(dp2, -1, sizeof(dp2));
  if (n%2 == 0) {
    cout << max(solve1(2, 0) + a[1], solve1(2, 1)) << endl;
  }
  else {
    cout << solve2(1, 0, 0) << endl;
  }
  return 0;
}