#include using namespace std; const int N = 510000; struct PT { long long x, y; bool operator<(const PT &rhs) const { return x < rhs.x || (x == rhs.x && y < rhs.y); } } L[N], R[N]; long long cross(PT p, PT p1, PT p2) { return (p1.x - p.x) * (p2.y - p.y) - (p2.x - p.x) * (p1.y - p.y); } const long long inf = 1LL<<61; vector V[1<<20]; long long s[N], t[N]; long long solve(int u, int l, int r) { // cerr << u << ' ' << l << ' ' << r << endl; if (l == r) { V[u].push_back((PT){-2LL*s[l], t[l]+1LL*s[l]*s[l]}); return -inf; } int m = l + r >> 1; long long ret = -inf; ret = max(ret, solve(u + u, l, m)); ret = max(ret, solve(u + u + 1, m + 1, r)); // cerr << u << " " << "k" << endl; assert(V[u+u].size() == m-l+1); assert(V[u+u+1].size() == r-m); for (int i = 0, j = 0; i < V[u+u].size() || j < V[u+u+1].size(); ) { if (i == V[u+u].size() || (j < V[u+u+1].size() && V[u+u+1][j] < V[u+u][i])) { V[u].push_back(V[u+u+1][j]), j++; } else { V[u].push_back(V[u+u][i++]); } } // cerr << u << ' ' << V[u].size() << endl; assert(V[u].size() == r-l+1); int n = 0; for (int i = 0; i < V[u+u].size(); i++) { PT cur = V[u+u][i]; while (n > 1 && cross(L[n-2], L[n-1], cur) >= 0) n--; L[n++] = cur; } int h = 0; // cerr << "ok" << endl; for (int i = (int)V[u+u+1].size()-1; i >= 0; i--) { long long x = -V[u+u+1][i].x / 2; long long y = -V[u+u+1][i].y + 2*x*x; // cerr << x << ' ' << y << endl; while (h < n-1 && L[h].x * x + L[h].y < L[h+1].x * x + L[h+1].y) h++; ret = max(ret, L[h].x * x + L[h].y + y); } return ret; } int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { int x; scanf("%d", &x); s[i] = s[i-1] + x; t[i] = t[i-1] + 1LL * x * x; } printf("%lld\n", solve(1, 0, n) / 2); return 0; }