#include<bits/stdc++.h> #define MAXN 1000005 #define int long long usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1ll; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3ll)+(x<<1ll)+(ch^'0'); ch=getchar(); } return x*f; } int sum[MAXN]; int dp[MAXN],q[MAXN],head,rear; inlinedoubleSlope(int i,int j){ return (double)(dp[i]+sum[i]*sum[i]-dp[j]-sum[j]*sum[j])/(double)(sum[i]-sum[j]); } #undef int intmain(){ #define int long long int n,M; while (~scanf("%lld%lld",&n,&M)){ memset(sum,0,sizeof(sum)); for (registerint i=1;i<=n;++i){ int x; scanf("%lld",&x); sum[i]=sum[i-1]+x; } memset(dp,0,sizeof(dp)); memset(q,0,sizeof(q)); head=1,rear=1; q[1]=0; for (registerint i=1;i<=n;++i){ while (head<rear&&Slope(q[head+1],q[head])<=(double)2.00*sum[i]) head++; int j=q[head]; dp[i]=dp[j]+M+(sum[i]-sum[j])*(sum[i]-sum[j]); while (head<rear&&Slope(q[rear],q[rear-1])>=Slope(i,q[rear])) rear--; q[++rear]=i; } printf("%lld\n",dp[n]); } }