func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MX = 400000;   long long l[500000], r[500000], k[500000], b[500000], a[500000], pref1[500000],       pref2[500000], s = MX;   long long f(long long b1, long long a1, long long b2, long long a2) {     return (b1 - b2) / (a1 - a2);   }   void add(long long kx, long long bx) {     if (s == MX) {       l[s] = -2e18;       r[s] = 2e18;       b[s] = bx;       k[s] = kx;       s--;       return;     }     if (f(bx, kx, b[s + 1], k[s + 1]) > r[s + 1]) {       s++;       add(kx, bx);       return;     }     l[s] = -2e18;     r[s] = f(bx, kx, b[s + 1], k[s + 1]);     b[s] = bx;     k[s] = kx;     l[s + 1] = r[s] + 1;     s--;     return;   }   int main() {     ios::sync_with_stdio(0);     long long n;     cin >> n;     for (int i = 0; i < n; i++) cin >> a[i];     pref1[0] = a[0];     pref2[0] = a[0];     for (int i = 1; i < n; i++) {       pref1[i] = pref1[i - 1] + a[i];       pref2[i] = pref2[i - 1] + a[i] * (i + 1);     }     long long ans = 0;     for (long long i = 0; i < n; i++) {       ans = max(ans, pref2[i]);       long long lt = s + 1, rt = MX;       while (lt < rt) {         long long mid = (lt + rt) / 2;         if (lt == rt - 1) mid++;         if (pref1[i] < l[mid])           rt = mid - 1;         else           lt = mid;       }       long long q = 0, t = 0;       if (i > 0) {         q = pref2[i - 1];         t = pref1[i - 1];       }       if (lt <= MX) ans = max(ans, pref2[i] - b[lt] + pref1[i] * k[lt]);       add(-i - 1, -(pref1[i] * (i + 1) - pref2[i]));     }     cout << ans <<   n ;   }   