#include<bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(),x.end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define debug(v) cout<<#v<<":";for(auto x:v){cout<<x<<' ';}cout<<endl;
#define mod 1000000007
using ll=long long;
const int INF=1000000000;
const ll LINF=1001002003004005006ll;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}
template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;}
 
struct IOSetup{
    IOSetup(){
        cin.tie(0);
        ios::sync_with_stdio(0);
        cout<<fixed<<setprecision(12);
    }
} iosetup;
 
template<typename T1,typename T2>
ostream &operator<<(ostream &os,const pair<T1,T2>&p){
    os<<p.first<<" "<<p.second;
    return os;
}
 
template<typename T>
ostream &operator<<(ostream &os,const vector<T>&v){
    for(int i=0;i<(int)v.size();i++) os<<v[i]<<(i+1==(int)v.size()?"":" ");
    return os;
}

template<typename T1,typename T2>
istream &operator>>(istream &is,pair<T1,T2>&p){
    is>>p.first>>p.second;
    return is;
}

template<typename T>
istream &operator>>(istream &is,vector<T>&v){
    for(T &x:v)is>>x;
    return is;
}



// 2^127 = 170141183460469231731687303715884105728 ~ 10^38
using int128=__int128;
 
ostream &operator<<(ostream &os,const __int128 n){
    if(n==0){
        os<<0;
        return os;
    }
    __int128 num=n;
    bool neg=false;
    if(num<0)neg=true,num=-num;
    string res="";
    while(num>0){
        res.push_back('0'+num%10);
        num/=10;
    }
    if(neg) res.push_back('-');
    reverse(begin(res),end(res));
    os<<res;
    return os;
}
 
istream &operator>>(istream &is,__int128 &n){
    string s;
    is>>s;
    int idx=0;
    bool neg=false;
    if(s[0]=='-')neg=true,idx++;
    n=0;
    for(;idx<(int)s.size();idx++){
        n=10*n+s[idx]-'0';
    }
    if(neg) n=-n;
    return is;
}
 
__int128 abs128(__int128 x){
    return x<0?-x:x;
}


template<typename T>
struct LiChaoTree{
    struct Line{
        T a,b;
        Line(T a,T b):a(a),b(b){}
        T get(T x)const{return a*x+b;}
        bool over(const Line &b,const T &x){return get(x)<b.get(x);}
    };

    vector<T> xs;
    vector<Line> seg;
    int sz;
    LiChaoTree(const vector<T> &x,T INF):xs(x){
        sz=1;
        while(sz<(int)xs.size())sz<<=1;
        while((int)xs.size()<sz)xs.push_back(xs.back()+1);
        seg.assign(2*sz,Line(0,INF));
    }
    void update(Line &x,int k,int l,int r){
        int m=(l+r)/2;
        bool lc=x.over(seg[k],xs[l]),mc=x.over(seg[k],xs[m]);
        if(mc)swap(seg[k],x);
        if(l+1>=r) return ;
        else if(lc!=mc) update(x,2*k,l,m);
        else            update(x,2*k+1,m,r);
    }
    // add ax+b
    void update(T a,T b){
        Line l(a,b);
        update(l,1,0,sz);
    }
    // xs[k]
    T query(int k){
        T x=xs[k];
        k+=sz;
        T ret=seg[k].get(x);
        while(k>1){
            k>>=1;
            chmin(ret,seg[k].get(x));
        }
        return ret;
    }
};


signed main(){
    int n;int128 c;cin>>n>>c;
    int128 h0;cin>>h0;
    n--;
    vector<int128> h(n);
    cin>>h;
    for(auto &x:h)x-=h0;

    LiChaoTree<int128> seg(h,LINF);
    seg.update(0,0);
    int128 d;
    rep(i,n){
        d=seg.query(i);
        d+=h[i]*h[i]+c;
        seg.update(-2*h[i],h[i]*h[i]+d);
    }
    cout<<d<<endl;
    return 0;
}


Measured memory_bytes: 26812