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: Time Limit Exceeded)

#include <bits/stdc++.h>
#define F first
#define S second
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
LL solve(vector<LL> &data, vector<LL> &E, vector<LL> &O, int L, int R) {
    int k = (R - L) / 2;
    if (k == 0) return 0;
    if (k == 1) {
        LL ans = -INF;
        for (int i = L ; i < R ; i++)
            ans = max(ans, data[i]);
        return ans;
    }
    LL ans = -INF;
    for (int i = 0 ; i <= k ; i++) {
        ans = max(ans, E[i + L / 2] - E[L / 2] + O[O.size() - L / 2 - 1] - O[O.size() - (k - i) - L / 2 - 1]);
        ans = max(ans, O[i + L / 2] - O[L / 2] + E[E.size() - L / 2 - 1] - E[E.size() - (k - i) - L / 2 - 1]);
    }
    ans = max(ans, solve(data, E, O, L + 2, R - 2) + data[L] + data[R - 1]);
    return ans;
}
int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);
    int n; cin >> n;
    vector<LL> data(n);
    for (auto &v : data)
        cin >> v;
    vector<LL> O{0}, E{0};
    for (int i = 0 ; i < n ; i++) {
        if (i % 2) {
            O.push_back(O.back() + data[i]);
        } else
            E.push_back(E.back() + data[i]);
    }
    LL ans = -INF;
    if (n % 2 == 0) {
        for (int i = 0 ; i < E.size() ; i++)
            ans = max(ans, E[i] + O.back() - O[O.size() - (n / 2 - i) - 1]);
        cout << ans << '\n';
    } else {
        cout << solve(data, E, O, 0, data.size()) << '\n';
    }

}