func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long linf = 1e18 + 5;   const int mod = (int)1e9 + 7;   const int logN = 17;   const int inf = 1e9;   const int N = 2e5 + 5;   int n, a[N], s;   vector<pair<long long, long long> > T[N << 2], g[N << 2];   pair<long long, long long> line[N];   long long pre[N];   int P[N << 2];   double intersect(pair<long long, long long> x, pair<long long, long long> y) {     return (y.second - x.second) * 1.0 / (x.first - y.first);   }   void add(vector<pair<long long, long long> > &T, pair<long long, long long> x) {     int s = T.size() - 1;     while (s > 0 && intersect(T[s], T[s - 1]) >= intersect(T[s], x)) {       T.pop_back();       s--;     }     T.push_back(x);   }   void init(int k, int bas, int son) {     P[k] = 0;     if (bas == son) {       T[k].clear();       g[k].clear();       T[k].push_back(line[bas]);       g[k].push_back(line[bas]);       return;     }     init((k + k), bas, (bas + son >> 1));     init((k + k + 1), (bas + son >> 1) + 1, son);     g[k].resize(g[(k + k)].size() + g[(k + k + 1)].size());     merge(g[(k + k)].begin(), g[(k + k)].end(), g[(k + k + 1)].begin(),           g[(k + k + 1)].end(), g[k].begin());     for (__typeof(g[k].begin()) it = g[k].begin(); it != g[k].end(); it++)       add(T[k], *it);     P[k] = 0;   }   long long query(int k, int bas, int son, int x, int y, long long t) {     if (bas > y || son < x) return -linf;     if (x <= bas && son <= y) {       while (P[k] < T[k].size() - 1 && intersect(T[k][P[k]], T[k][P[k] + 1]) <= t)         P[k]++;       return T[k][P[k]].first * t + T[k][P[k]].second;     }     return max(query((k + k), bas, (bas + son >> 1), x, y, t),                query((k + k + 1), (bas + son >> 1) + 1, son, x, y, t));   }   int main() {     scanf( %d , &n);     long long ans = 0;     for (int i = 1; i <= n; i++) {       scanf( %d , &a[i]);       pre[i] = pre[i - 1] + a[i];       ans += a[i] * (long long)i;     }     for (int i = 0; i <= n; i++) line[i] = make_pair(i, pre[n] - pre[i]);     init(1, 0, n);     long long res = -linf;     vector<pair<int, int> > look;     for (int i = 1; i <= n; i++) look.push_back(make_pair(a[i], i));     sort(look.begin(), look.end());     for (__typeof(look.begin()) it = look.begin(); it != look.end(); it++) {       long long left = query(1, 0, n, 0, it->second, it->first);       res = max(res, ans + left - (pre[n] - pre[it->second]) -                          it->second * (long long)it->first);       left = query(1, 0, n, it->second + 2, n, it->first);       res = max(res, ans + left - (pre[n] - pre[it->second]) -                          it->second * (long long)it->first);     }     cout << res <<   n ;     return 0;   }   