HDU - 3507
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define maxn 1000005
using namespace std;
int dp[maxn];
int sta[maxn];
int h=0,t=0;
int n,m;
long long sum[maxn];
double g(int a){
return dp[a]+sum[a]*sum[a];
}
int main(){
int u;
while(~scanf("%d%d",&n,&m)){
h=t=0;
sta[t++]=0;
for(int i=1;i<=n;i++){
scanf("%d",&u);
sum[i]=sum[i-1]+u;
while(h<t-1 && (g(sta[h+1])-g(sta[h]))<=1ll*2*sum[i]*(sum[sta[h+1]]-sum[sta[h]]))
h++;
dp[i]=dp[sta[h]]+(sum[i]-sum[sta[h]])*(sum[i]-sum[sta[h]])+m;
while(h<t-1 && (g(sta[t-1])-g(sta[t-2]))*(sum[i]-sum[sta[t-1]])>=(g(i)-g(sta[t-1]))*(sum[sta[t-1]]-sum[sta[t-2]]))
t--;
sta[t++]=i;
}
printf("%d\n",dp[n]);
}
}