#include using namespace std; const int maxn = 5e5 + 50; int n , A[maxn] , tail; long long Sum[maxn] , T[maxn] , ans; pair < long long , long long > p1[maxn] , p2[maxn] , Convex[maxn]; long long Compute( int l , int r ){ return Sum[r] * Sum[r] - Sum[r] * Sum[l - 1] - T[r] + T[l - 1]; } double Cross( pair < long long , long long > x , pair < long long , long long > y ){ return 1. * x.first * y.second - 1. * x.second * y.first; } void ins1( pair < long long , long long > c ){ while( tail > 1 && Cross( make_pair( Convex[tail - 1].first - Convex[tail - 2].first , Convex[tail - 1].second - Convex[tail - 2].second ) , make_pair( c.first - Convex[tail - 1].first , c.second - Convex[tail - 1].second ) ) >= 0 ) -- tail; Convex[tail ++] = c; } void ins2( pair < long long , long long > c ){ while( tail > 1 && Cross( make_pair( Convex[tail - 1].first - Convex[tail - 2].first , Convex[tail - 1].second - Convex[tail - 2].second ) , make_pair( c.first - Convex[tail - 1].first , c.second - Convex[tail - 1].second ) ) <= 0 ) -- tail; Convex[tail ++] = c; } void Gao( int l , int r ){ int mid = l + r >> 1; for(int i = l ; i <= mid ; ++ i) p1[i] = { Sum[i] , T[i] }; for(int i = mid + 1 ; i <= r ; ++ i) p2[i] = { Sum[i] , T[i] }; sort( p1 + l , p1 + mid + 1 ); sort( p2 + mid + 1 , p2 + r + 1 ); tail = 0; for(int i = mid + 1 , j = l ; i <= r ; ++ i){ while( j <= mid && p1[j].first <= p2[i].first ){ ins1( p1[j] ); ++ j; } int l = 0 , r = tail - 1; while( l < r ){ int mid = l + r >> 1; long long cost1 = p2[i].first * p2[i].first - p2[i].first * Convex[mid].first - p2[i].second + Convex[mid].second; long long cost2 = p2[i].first * p2[i].first - p2[i].first * Convex[mid + 1].first - p2[i].second + Convex[mid + 1].second; if( cost1 >= cost2 ) r = mid; else l = mid + 1; } ans = max( ans , p2[i].first * p2[i].first - p2[i].first * Convex[l].first - p2[i].second + Convex[l].second ); } sort( p1 + l , p1 + mid + 1 , greater < pair < long long , long long > >() ); sort( p2 + mid + 1 , p2 + r + 1 , greater < pair < long long , long long > >() ); tail = 0; for(int i = mid + 1 , j = l ; i <= r ; ++ i){ while( j <= mid && p1[j].first >= p2[i].first ){ ins2( p1[j] ); ++ j; } int l = 0 , r = tail - 1; while( l < r ){ int mid = l + r >> 1; long long cost1 = p2[i].first * p2[i].first - p2[i].first * Convex[mid].first - p2[i].second + Convex[mid].second; long long cost2 = p2[i].first * p2[i].first - p2[i].first * Convex[mid + 1].first - p2[i].second + Convex[mid + 1].second; if( cost1 >= cost2 ) r = mid; else l = mid + 1; } ans = max( ans , p2[i].first * p2[i].first - p2[i].first * Convex[l].first - p2[i].second + Convex[l].second ); } } void Solve( int l , int r ){ if( l >= r ) return; else{ int mid = l + r >> 1; Gao( l , r ); Solve( l , mid ); Solve( mid + 1 , r ); } } int main( int argc , char * argv[] ){ scanf( "%d" , & n ); for(int i = 1 ; i <= n ; ++ i){ scanf( "%d" , A + i ); Sum[i] = Sum[i - 1] + A[i]; T[i] = T[i - 1] + 1ll * A[i] * Sum[i]; } Solve( 0 , n ); printf( "%lld\n" , ans ); return 0; }