#include<cstdio>
#include<cstring>
#include<algorithm>
using std::min;
using std::max;
const int M=1e5+7,inf=0x3f3f3f3f;
int read(){
int ans=0,f=1,c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
return ans*f;
}
int n,c,ans,mn;
int h[M],f[M][107];
int main(){
n=read(); c=read();
for(int i=1;i<=n;i++) h[i]=read();
memset(f,0x3f,sizeof(f));
for(int i=h[1];i<=100;i++) f[1][i]=(h[1]-i)*(h[1]-i);
for(int k=2;k<=n;k++){
mn=inf;
for(int i=h[k-1];i<max(h[k-1],h[k]);i++) mn=min(mn,f[k-1][i]-c*i);
for(int i=h[k];i<=100;i++){
mn=min(mn,f[k-1][i]-c*i);
f[k][i]=mn+c*i+(h[k]-i)*(h[k]-i);
}
mn=inf;
for(int i=100;i>=h[k];i--){
if(i>=h[k-1]) mn=min(mn,f[k-1][i]+c*i);
f[k][i]=min(f[k][i],mn-c*i+(h[k]-i)*(h[k]-i));
}
}
ans=inf;
for(int i=1;i<=100;i++) ans=min(ans,f[n][i]);
printf("%d\n",ans);
return 0;
}