#include using namespace std; typedef long long ll; #define pb push_back #define fi first #define se second #define all(v) (v).begin(), (v).end() const int MAXN = 5e5 + 5; const ll INF = 1e18; int ar[MAXN]; ll S[MAXN], M[MAXN], B[MAXN], c[MAXN]; int sz = 0; bool bad(int l1, int l2, int l3) { return (B[l1]-B[l2])*(M[l3]-M[l1])>(B[l1]-B[l3])*(M[l2]-M[l1]); } void add(ll m, ll b) { M[sz] = m; B[sz] = b; sz++; while (sz >= 3 && bad(sz-3, sz-2, sz-1)) { swap(B[sz-1], B[sz-2]); swap(M[sz-1], M[sz-2]); sz--; } } inline ll eval(int pos, ll x) { return M[pos] * x + B[pos]; } ll query(ll x) { int lo = 0, hi = sz-2, ans = 0; while (lo <= hi) { int mid = (lo + hi) >> 1; if (eval(mid, x) < eval(mid+1, x)) { ans = mid+1; lo = mid+1; } else hi = mid-1; } return eval(ans, x); } ll solve(int L, int R) { if (L >= R) return 0; int mid = (L + R) >> 1; ll ans = 0; sz = 0; // INITITTT vector > vec; ll sum = 0, val = 0; for (int i = mid; i >= L; i--) { val += ar[i] * 1LL * sum; sum += ar[i]; vec.pb(make_pair(sum, val)); } sort(all(vec)); for (auto it : vec) { add(it.fi, it.se); } sum = val = 0; for (int i = mid + 1; i <= R; i++) { val += ar[i] * 1LL * sum; sum += ar[i]; ans = max(ans, query(sum) + val); } return max(ans, max(solve(L, mid), solve(mid + 1, R))); } int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &ar[i]); /* ll ans = 0; for (int i = 1; i <= n; i++) { ll sum = 0, cur = 0; for (int j = i; j <= n; j++) { cur += sum * ar[j]; ans = max(ans, cur); sum += ar[j]; } } printf("%lld\n", ans); */ printf("%lld\n", solve(1, n)); return 0; }