#include <algorithm>
#include <iostream>
#include <cstdio>
#include <map>
#include <numeric>
#include <cmath>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <complex>
#include <string.h>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <iomanip>
#include <sys/time.h>
#include <tuple>
#include <random>
using namespace std;

#define endl '\n'
#define ALL(v) (v).begin(), (v).end()
#define RALL(v) (v).rbegin(), (v).rend()
#define UNIQ(v) (v).erase(unique((v).begin(), (v).end()), (v).end())

typedef long long ll;
typedef long double ld;
typedef pair<int, int> P;
typedef complex<double> comp;
typedef vector< vector<ld> > matrix;
struct pairhash {
public:
    template<typename T, typename U>
    size_t operator()(const pair<T, U> &x) const {
	size_t seed = hash<T>()(x.first);
	return hash<U>()(x.second) + 0x9e3779b9 + (seed<<6) + (seed>>2);
    }
};
const int inf = 1e9 + 9;
const ll mod = 1e9 + 7;
const double eps = 1e-8;
const double pi = acos(-1);

int n;
ll c;
ll h[200100];

ll dp[200100];

template<typename T>
class ConvexHullTrick {
    class Node {
    public:
        ll l, r; // [l, r]
        T a, b;  // 直線 ax+b
        Node* child_L;
        Node* child_R;
        Node(ll l, ll r) {
            this->l = l;
            this->r = r;
            this->a = 0;
            this->b = init;
            this->child_L = nullptr;
            this->child_R = nullptr;
        }
    };

    Node* root;
    ll N;
    //const T init = -2e18;  // 最大値を求める
    static const T init = 2e18;  // 最小値を求める
    static const ll MAX_N;
    static bool op(const T& a, const T& b) {
        //return a >= b;  // 最大値を求める
        return a <= b;  // 最小値を求める
    }
public:
    ConvexHullTrick(ll n = MAX_N) {
        this->N = n;
        this->root = new Node(0, n);
    }

    void reset(ll n) {
        this->N = n;
        this->root = new Node(0, n);
    }

    void add(Node* node, T a, T b) {
        const ll xl = node->l;
        const ll xr = node->r;
        const ll xm = (xl + xr) / 2;
        T vl = node->a * xl + node->b;
        T vr = node->a * xr + node->b;
        T vm = node->a * xm + node->b;
        T nvl = a * xl + b;
        T nvr = a * xr + b;
        T nvm = a * xm + b;
        // (最大値の場合)3点とも元の直線の方が大きいなら何もせず終了
        if (op(vl, nvl) && op(vr, nvr) && op(vm, nvm)) return;
        // (最大値の場合)3点とも新しい直線の方が大きいなら直線を書き換えて終了
        if (!op(vl, nvl) && !op(vr, nvr) && !op(vm, nvm)) {
            node->a = a;
            node->b = b;
            return;
        }
        // (最大値の場合)真ん中の点で新しい直線の方が大きい場合スワップ
        // 新しい直線が左端か右端でのみ大きくなる
        if (!op(vm, nvm)) {
            swap(node->a, a);
            swap(node->b, b);
            swap(vl, nvl);
            swap(vr, nvr);
        }
        // (最大値の場合)新しい直線の方が左端で大きくなる場合
        // 左の子に降りる
        if (!op(vl, nvl)) {
            if (node->child_L == nullptr) {
                ll mid = (node->l + node->r) / 2;
                node->child_L = new Node(node->l, mid);
            }
            add(node->child_L, a, b);
        }
        // (最大値の場合)新しい直線の方が右端で大きくなる場合
        // 右の子に降りる
        else {
            if (node->child_R == nullptr) {
                ll mid = (node->l + node->r) / 2 + 1;
                node->child_R = new Node(mid, node->r);
            }
            add(node->child_R, a, b);
        }
    }
    void add(T a, T b) {
        add(this->root, a, b);
    }

    T query(Node* node, ll x) {
        if (node == nullptr || !(node->l <= x && x <= node->r)) return init;
        T val = node->a * x + node->b;
        T val_l = query(node->child_L, x);
        T val_r = query(node->child_R, x);
        if (op(val_l, val)) val = val_l;
        if (op(val_r, val)) val = val_r;
        return val;
    }
    T query(ll x) {
        return query(this->root, x);
    }
};

ll solve() {
    ConvexHullTrick<ll> cv(1000100);
    dp[0] = 0;
    cv.add(-2*h[0], h[0]*h[0]);
    for (int i = 1; i < n; i++) {
        ll val = cv.query(h[i]);
        dp[i] = h[i] * h[i] + c + val;
        cv.add(-2*h[i], dp[i] + h[i]*h[i]);
    }
    return dp[n-1];
}

void input() {
    cin >> n >> c;
    for (int i = 0; i < n; i++) cin >> h[i];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout << fixed << setprecision(15);

    input();
    cout << solve() << endl;
}


Measured memory_bytes: 19180