func_code_string: #include <bits/stdc++.h>   using namespace std;   int arr[100002][2];   long long dp[100002][2][2];   int n;   long long solve(int idx, int arga3, int dir) {     if (idx == 1 && dir == 0) return 0;     if (idx == n && dir == 1) return 0;     long long &ret = dp[idx][arga3][dir];     if (ret != -1) return ret;     ret = 0;     int fd;     if (dir == 0)       fd = -1;     else       fd = 1;     if (arga3) {       int x = arr[idx][dir];       if (x % 2) x--;       if (x) ret = max(ret, solve(idx + fd, arga3, dir) + x);     } else {       int x = arr[idx][dir];       if (x == 1)         ret = max(ret, solve(idx + fd, false, dir) + 1);       else if (x % 2) {         ret = max(ret, solve(idx + fd, false, dir) + x);         x--;         ret = max(ret, solve(idx + fd, true, dir) + x);       } else if (x) {         ret = max(ret, solve(idx + fd, true, dir) + x);         x--;         ret = max(ret, solve(idx + fd, false, dir) + x);       }     }     return ret;   }   int main() {     cin >> n;     for (long long i = 1; i <= n - 1; i++) {       int x;       cin >> x;       arr[i][1] = x;       arr[i + 1][0] = x;     }     memset(dp, -1, sizeof dp);     long long ans = 0;     for (long long i = 1; i <= n; i++) {       if (i == 1) {         int x = arr[i][1];         if (x == 1) {           ans = max(ans, solve(2, false, 1) + 1);         } else {           if (x % 2) {             ans = max(ans, solve(2, false, 1) + x);             ans = max(ans, solve(2, true, 1) + x - 1);           } else {             ans = max(ans, solve(2, true, 1) + x);             ans = max(ans, solve(2, false, 1) + x - 1);           }         }       } else if (i == n) {         int x = arr[n][0];         if (x == 1) {           ans = max(ans, solve(n - 1, false, 0) + 1);         } else {           if (x % 2) {             ans = max(ans, solve(n - 1, false, 0) + x);             ans = max(ans, solve(n - 1, true, 0) + x - 1);           } else {             ans = max(ans, solve(n - 1, true, 0) + x);             ans = max(ans, solve(n - 1, false, 0) + x - 1);           }         }       } else {         if (arr[i][0] % 2 && arr[i][1] % 2) {           long long y7 = 0, ym = 0, s7 = 0, sm = 0;           if (arr[i][1] - 1) y7 = solve(i + 1, true, 1) + arr[i][1] - 1;           ym = solve(i + 1, false, 1) + arr[i][1];           if (arr[i][0] - 1) s7 = solve(i - 1, true, 0) + arr[i][0] - 1;           sm = solve(i - 1, false, 0) + arr[i][0];           ans = max(ans, y7 + s7);           ans = max(ans, y7 + sm);           ans = max(ans, ym + s7);         } else if (arr[i][1] % 2) {           long long y7 = 0, ym = 0, s7 = 0, sm = 0;           if (arr[i][1] - 1) y7 = solve(i + 1, true, 1) + arr[i][1] - 1;           ym = solve(i + 1, false, 1) + arr[i][1];           s7 = solve(i - 1, true, 0) + arr[i][0];           sm = solve(i - 1, false, 0) + arr[i][0] - 1;           ans = max(ans, y7 + s7);           ans = max(ans, y7 + sm);           ans = max(ans, ym + s7);         } else if (arr[i][0] % 2) {           long long y7 = 0, ym = 0, s7 = 0, sm = 0;           y7 = solve(i + 1, true, 1) + arr[i][1];           ym = solve(i + 1, false, 1) + arr[i][1] - 1;           if (arr[i][0] - 1) s7 = solve(i - 1, true, 0) + arr[i][0] - 1;           sm = solve(i - 1, false, 0) + arr[i][0];           ans = max(ans, y7 + s7);           ans = max(ans, y7 + sm);           ans = max(ans, ym + s7);         } else {           long long y7 = 0, ym = 0, s7 = 0, sm = 0;           y7 = solve(i + 1, true, 1) + arr[i][1];           ym = solve(i + 1, false, 1) + arr[i][1] - 1;           s7 = solve(i - 1, true, 0) + arr[i][0];           sm = solve(i - 1, false, 0) + arr[i][0] - 1;           ans = max(ans, y7 + s7);           ans = max(ans, y7 + sm);           ans = max(ans, ym + s7);         }       }     }     cout << ans;     return 0;   }   