/* #pragma comment(linker, "/stack:200000000") #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") ./**/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include using namespace std; //using namespace __gnu_cxx; //defines typedef long long ll; typedef long double ld; #define TIME clock() * 1.0 / CLOCKS_PER_SEC #define fast_read cin.sync_with_stdio(0) #define PREX(number) cout << fixed << setprecision(number) #define nul point(0, 0) #define random srand(time(NULL)) #define rand_int abs((rand() << 15) | rand()) #define str_to_int(stroka) atoi(stroka.c_str()) #define str_to_ll(stroka) atoll(stroka.c_str()) #define str_to_double(stroka) atof(stroka.c_str()) #define what_is(x) cerr << #x << " is " << x << endl #define solve_system int number; cin >> number; for (int i = 0; i < number; i++) solve() #define solve_system_scanf int number; scanf("%d", &number); forn(i, 0, number) solve() //easy functions template< typename T > T gcd(T a, T b) { return a ? gcd(b % a, a) : b; } template< typename T > T lcm(T a, T b) { return (a / gcd(a, b)) * b; } bool is_down(char x) { return ('a' <= x && x <= 'z'); } bool is_upper(char x) { return ('A' <= x && x <= 'Z'); } bool is_digit(char x) { return ('0' <= x && x <= '9'); } //constants const ld pi = 3.141592653589793238462643383279; const ld log23 = 1.58496250072115618145373894394781; const ld eps = 1e-8; const ld zero = 0; const ll INF = 1e18; const int COUT = 30; const int prost = 239; const ll prost64 = 239; const int two = 2; const int thr = 3; const ll sr = 31; const ll MOD = 1e9 + 7; const int BIG = 2 * 1e9 + 1; const int alf = 26; const int MAX_N = 5 * 1e5 + 1; const int MAX_M = 2001; const int MAX_T = (1 << 20); const int B = trunc(sqrt(MAX_N)) + 1; const int MAX_LOG = 19; const int km = (1 << 18); const int dx[4] = {-1, 0, 1, 0}; const int dy[4] = {0, 1, 0, -1}; const int dxo[8] = {-1, -1, -1, 0, 1, 1, 1, 0}; const int dyo[8] = {-1, 0, 1, 1, 1, 0, -1, -1}; const int bit_max = 32; const int dig = 10; const string str_alf = "abcdefghijklmnopqrstuvwxyz"; const string str_alf_big = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const int day[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; const int digarr[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}; const int bt = 31; // Code starts here struct point { ld x, y; point() { x = y = 0; } point(ld a, ld b) { x = a; y = b; } bool operator<(const point &p) const { return x < p.x; } }; struct line { ll a, b; line() { a = b = 0; } line(ll x, ll y) { a = x; b = y; } ll gett(ll x) { return (a + b * x); } bool operator<(const line &l) const { return b < l.b; } }; point inter(line a, line b) { ld x = (ld)(b.a - a.a) / (ld)(a.b - b.b); ld y = 0; return point(x, y); } vector > q; void add(ll a, ll b) { line l = line(a, b); while (!q.empty()) { point r = q.back().first; line u = q.back().second; point e = inter(u, l); if (e.x <= r.x) { q.pop_back(); continue; } q.push_back(make_pair(e, l)); break; } if (q.empty()) q.push_back(make_pair(point(-BIG, 0), l)); } ll gett(ll x) { int ind = upper_bound(q.begin(), q.end(), make_pair(point(x, 0), line(0, 0))) - q.begin(); ind--; return q[ind].second.gett(x); } int n; ll a[MAX_N]; ll func(int l, int r) { if (r - l == 1) return 0; int mid = (l + r) >> 1; ll ans = max(func(l, mid), func(mid, r)); vector > ln; q.clear(); ll sm = 0; ll sq = 0; for (int i = mid; i < r; i++) { sm += a[i]; sq += a[i] * a[i]; ln.push_back(make_pair(2 * sm, sm * sm - sq)); } sort(ln.begin(), ln.end()); int it = 0; for (pair t : ln) { if (it == (int)ln.size() - 1 || ln[it + 1].first > ln[it].first) add(t.second, t.first); it++; } sm = 0; sq = 0; for (int i = mid - 1; i >= l; i--) { sm += a[i]; sq += a[i] * a[i]; ans = max(ans, gett(sm) + (sm * sm - sq)); } return ans; } int main() { /* #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif /**/ fast_read; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; cout << func(0, n) / 2LL; return 0; }