#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(x) x.begin() , x.end() #define fi first #define se second #define pb push_back #define umax( x , y ) x = max( x , (y) ) #define umin( x , y ) x = min( x , (y) ) #define For( i , a ) for(int i=1;i<=a;i++) #define ort (b+s)/2 #define y2 asrwjaelkf #define y1 asseopirwjaelkf #define set multiset using namespace std; inline int read() { int res = 0 ;int neg ; while(true){char ch = getchar();if(ch>='0' && ch<='9' || ch=='-'){if(ch=='-') neg = -1;else neg = 1 , res = ch-'0';break;} } while(true){char ch = getchar();if(ch>='0' && ch<='9') res*=10 , res+=ch-'0';else break;} return res*neg; } typedef long long Lint; typedef double db; typedef pair ii; typedef pair dd; typedef pair ddd; typedef pair iii; typedef pair i4; const int maxn = 500120; const int maxm = 1000020; const int MOd = 1e9 + 7; const int K = 400; int a, ar[maxn], n; Lint p[maxn], g[maxn]; vector segment[maxn*3], st[maxn*3]; db inter( ii a, ii b ) { if( a.fi == b.fi ) { return -1e18; assert(0); } return (db)(a.se-b.se)/(b.fi-a.fi); } void add( vector &v, ii x ) { while( v.size() >= 2 && inter( v[v.size()-2], x ) <= inter( v[v.size()-2], v[v.size()-1] ) ) v.pop_back(); v.pb( x ); } Lint get( vector &v, Lint x ) { /* int l = 0, r = v.size()-2; while( l < r ) { int m = (l+2)/2; if( inter( v[m], v[m+1] ) ) }*/ int t = 0; for(int k=18;k>=0;k--) if( t+(1<>1, r=(r-1)>>1) { if( l&1 ) umax( t, get( st[l], x ) ); if( ~r&1 ) umax( t, get( st[r], x ) ); } return t; } int main() { //freopen("asd.in","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&a); for(int i=1;i<=a;i++) scanf("%d",&ar[i]); for(int i=1;i<=a;i++) p[i] = p[i-1] + ar[i]; for(int i=1;i<=a;i++) g[i] = g[i-1] + ar[i]*ar[i]; n = 1; while( n <= a ) n <<= 1; for(int i=0;i<=a;i++) { for(int k=i+n;k;k>>=1) segment[k].pb( ii( -2*p[i], p[i]*p[i]+g[i] ) ); } for(int i=1;i