func_code_string: #include <bits/stdc++.h>   using namespace std;   const int dy[] = {-1, 0, 1, 0}, dx[] = {0, 1, 0, -1};   const double EPS = 1e-8;   const double PI = acos(-1.0);   int popcount(int n) { return __builtin_popcount(n); }   int popcount(long long n) { return __builtin_popcountll(n); }   template <class T>   int SIZE(T a) {     return a.size();   }   template <class T>   string IntToString(T num) {     string res;     stringstream ss;     ss << num;     return ss.str();   }   template <class T>   T StringToInt(string str) {     T res = 0;     for (int i = 0; i < SIZE(str); i++) res = (res * 10 + str[i] -  0 );     return res;   }   template <class T>   T gcd(T a, T b) {     if (b == 0) return a;     return gcd(b, a % b);   }   template <class T>   T lcm(T a, T b) {     return a / gcd(a, b) * b;   }   template <class T>   void PrintSeq(T &a, int sz) {     for (int i = 0; i < sz; i++) {       cout << a[i];       if (sz == i + 1)         cout << endl;       else         cout <<    ;     }   }   bool EQ(double a, double b) { return abs(a - b) < EPS; }   void fastStream() {     cin.tie(0);     std::ios_base::sync_with_stdio(0);   }   vector<string> split(string str, char del) {     vector<string> res;     for (int i = 0, s = 0; i < SIZE(str); i++) {       if (str[i] == del) {         if (i - s != 0) res.push_back(str.substr(s, i - s));         s = i + 1;       } else if (i == SIZE(str) - 1) {         res.push_back(str.substr(s));       }     }     return res;   }   int N;   long long as[100001];   long long leftDP[2][100001];   long long rightDP[2][100001];   long long goLeft(int pari, int pos) {     if (leftDP[pari][pos] >= 0) return leftDP[pari][pos];     long long res = 0;     if (pos == 0) {     } else {       if (pari == 0) {         res = max(res,                   goLeft(pari, pos - 1) + as[pos - 1] - (as[pos - 1] % 2 == 0));         if (as[pos - 1] != 1)           res = max(res, goLeft(pari ^ 1, pos - 1) + as[pos - 1] -                              (as[pos - 1] % 2 == 1));       } else {         if (as[pos - 1] != 1)           res = max(res,                     goLeft(pari, pos - 1) + as[pos - 1] - (as[pos - 1] % 2 == 1));       }     }     return leftDP[pari][pos] = res;   }   long long goRight(int pari, int pos) {     if (rightDP[pari][pos] >= 0) return rightDP[pari][pos];     long long res = 0;     if (pos == N - 1) {     } else {       if (pari == 0) {         res = max(res, goRight(pari, pos + 1) + as[pos] - (as[pos] % 2 == 0));         if (as[pos] != 1)           res =               max(res, goRight(pari ^ 1, pos + 1) + as[pos] - (as[pos] % 2 == 1));       } else {         if (as[pos] != 1)           res = max(res, goRight(pari, pos + 1) + as[pos] - (as[pos] % 2));       }     }     return rightDP[pari][pos] = res;   }   int main() {     memset(leftDP, -1, sizeof(leftDP));     memset(rightDP, -1, sizeof(rightDP));     cin >> N;     for (int i = 0; i < N - 1; i++) cin >> as[i];     long long res = 0;     for (int i = 0; i < N; i++) {       res = max(res, goLeft(1, i) + goRight(1, i));       res = max(res, goLeft(1, i) + goRight(0, i));       res = max(res, goLeft(0, i) + goRight(1, i));     }     cout << res << endl;     return 0;   }   