/*
Though leaves are many , the root is one.
Through all the lying days of my youth
I swayed my leaves and flowers in the sun.
Now I may wither into the truth.
	  	  	- William Butler Yeats
*/
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
//#pragma GCC target("avx,tune=native")
#include<bits/stdc++.h>
#define int long long
#pragma comment("-Wl,--stack=1024000000")
//#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
namespace fastio{
    char in[100000];
    int itr=0,llen=0;
    char get(){
        if(itr==llen)llen=fread(in,1,100000,stdin),itr=0;
        if(llen==0)return EOF;
        return in[itr++];
    }
    char out[100000];
    int itr2=0;
    void put(char c){
        out[itr2++]=c;
        if(itr2==100000){
            fwrite(out,1,100000,stdout);
            itr2=0;
        }
    }
    int clear(){
        fwrite(out,1,itr2,stdout);
        itr2=0;
        return 0;
    }
    int getint(){
        int ret=0;char ch=get();
        if(ch=='-')return -getint();
        while (ch<'0'||ch>'9'){
            ch=get();if(ch=='-')return -getint();
        }
        while ('0'<=ch&&ch<='9'){
            ret=ret*10-48+ch;
            ch=get();
        }
        return ret;
    }
    string getstr(){
        string ret="";
        char ch=get();
        while(ch==' '||ch=='\n')ch=get();
        while(ch!=' '&&ch!='\n')ret.push_back(ch),ch=get();
        return ret;
    }
    void putstr(string s){
        for(int i=0;i<s.size();i++)put(s[i]);
    }
    void putint(int x){
        if(x<0){
            put('-');
            putint(-x);
            return;
        }
        if(x==0){
            put('0');put(' ');
            return;
        }
        char c[40];int pos=0;
        while(x){
            c[pos++]='0'+x%10;
            x/=10;
        }
        for(int i=pos-1;i>=0;i--)put(c[i]);
        put(' ');
    }
    void putln(int x){
        if(x<0){
            put('-');
            putln(-x);
            return;
        }
        if(x==0){
            put('0');put('\n');
            return;
        }
        char c[40];int pos=0;
        while(x){
            c[pos++]='0'+x%10;
            x/=10;
        }
        for(int i=pos-1;i>=0;i--)put(c[i]);
        put('\n');
    }
}
using namespace fastio;
//using namespace __gnu_pbds;
const int inf=0x3f3f3f3f;
const double eps=1e-6;
const int mod=1000000007;
typedef long long ll;
#ifndef LOCAL
#define cerr if(0)cout
#define eprintf(...) 0
#else
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#endif
inline string getstr(string &s,int l,int r){string ret="";for(int i=l;i<=r;i++)ret.push_back(s[i]);return ret;}
int modpow(int x,int y,int md=mod){int ret=1;do{if(y&1)ret=(ll)ret*x%md;x=(ll)x*x%md;}while(y>>=1);return ret;}
inline int Rand(){return rand()*32768+rand();}
int n,m;
ll c[500005],dp[500005],pre[500005];
ll sx[500005],sy[500005],sz;
double calc(int a,int b,int c,int d){
	return -1.0*(d-b)/(1.0*(c-a));
}
void add_stack(int x,int y){
	x=-x;y=-y;
	while(sz>=2){
		int a1=sx[sz],b1=sy[sz];
		int a2=sx[sz-1],b2=sy[sz-1];
		if(calc(a1,b1,a2,b2)>calc(a1,b1,x,y)){
			sz--;
		}else break;
	}
	sx[++sz]=x;sy[sz]=y;
}
ll func(int id,int x){
	return 1ll*x*sx[id]+sy[id];
}
ll query(int x){
	int l=1,r=sz+1;
	while(r-l>1){
		int mid=(l+r)/2;
		if(func(mid,x)>func(mid-1,x))l=mid;
		else r=mid;
	}
	return func(l,x);
}
signed main(){
	n=getint();m=getint();
	for(int i=1;i<=n;i++)pre[i]=getint();
	dp[1]=0;sz=0;
	add_stack(-2ll*pre[1],pre[1]*pre[1]);
	for(int i=2;i<=n;i++){
		dp[i]=pre[i]*pre[i]+m-query(pre[i]);
//		cerr<<"----"<<endl;
//		for(int j=1;j<=sz;j++)cerr<<sx[j]<<" "<<sy[j]<<endl;
//		cerr<<"----"<<endl;
		add_stack(-pre[i]*2ll,(ll)dp[i]+1ll*pre[i]*pre[i]);
//		cerr<<i<<" "<<dp[i]<<endl;
	}
	cout<<dp[n]<<endl;
	return 0;
}

Measured memory_bytes: 9960