#include <bits/stdc++.h>
using namespace std;

struct Benri { Benri() { std::cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(12);}} benri;

using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using pii = pair<int, int>;
using vll = vector<long long>;
using vvll = vector<vll>;
using pll = pair<ll, ll>;
using ull = unsigned long long;

template <typename T> using PQ = priority_queue<T>;
template <typename T> using minPQ = priority_queue<T, vector<T>, greater<T>>;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define mp make_pair
#define F first
#define S second

template<class T>bool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b < a) { a = b; return 1; } return 0; }

constexpr long long MOD = 1000000007;
//constexpr long long MOD = 998244353;
//constexpr int INF = 1001001001;
constexpr ll INF = 1001001001001001001ll;
constexpr double EPS = 1e-10;
using number = long long;


template< typename T, bool isMin >
struct ConvexHullTrickAddMonotone {
    using P = pair< T, T >;
    deque< P > H;

    ConvexHullTrickAddMonotone() = default;

    bool empty() const { return H.empty(); }
    void clear() { H.clear(); }

    inline int sgn(T x) { return x == 0 ? 0 : (x < 0 ? -1 : 1); }

    using D = long double;

    inline bool check(const P &a, const P &b, const P &c) {
        if (b.S == a.S || c.S == b.S)
            return sgn(b.F - a.F) * sgn(c.S - b.S) >= sgn(c.F - b.F) * sgn(b.S - a.S);

        //return (b.F-a.F)*(c.S-b.S) >= (b.S-a.S)*(c.F-b.F);
        return
            D(b.F - a.F) * sgn(c.S - b.S) / D(abs(b.S - a.S)) >=
            D(c.F - b.F) * sgn(b.S - a.S) / D(abs(c.S - b.S));
    }

    void add(T a, T b) {
        if (!isMin) a *= -1, b *= -1;
        P line(a, b);
        if (empty()) {
            H.emplace_front(line);
            return;
        }
        if (H.front().F <= a) {
            if (H.front().F == a) {
                if (H.front().S <= b) return;
                H.pop_front();
            }
            while (H.size() >= 2 && check(line, H.front(), H[1])) H.pop_front();
            H.emplace_front(line);
        } else {
            assert(a <= H.back().F);
            if (H.back().F == a) {
                if (H.back().S <= b) return;
                H.pop_back();
            }
            while (H.size() >= 2 && check(H[H.size() - 2], H.back(), line)) H.pop_back();
            H.emplace_back(line);
        }
    }

    inline T get_y(const P &a, const T &x) {
        return a.F * x + a.S;
    }

    T query(T x) {
        assert(!empty());
        int l = -1, r = H.size() - 1;
        while (l + 1 < r) {
            int m = (l + r) >> 1;
            if (get_y(H[m], x) >= get_y(H[m + 1], x)) l = m;
            else r = m;
        }
        if (isMin) return get_y(H[r], x);
        return -get_y(H[r], x);
    }

    T query_monotone_inc(T x) {
        assert(!empty());
        while (H.size() >= 2 && get_y(H.front(), x) >= get_y(H[1], x)) H.pop_front();
        if (isMin) return get_y(H.front(), x);
        return -get_y(H.front(), x);
    }

    T query_monotone_dec(T x) {
        assert(!empty());
        while (H.size() >= 2 && get_y(H.back(), x) >= get_y(H[H.size() - 2], x)) H.pop_back();
        if (isMin) return get_y(H.back(), x);
        return -get_y(H.back(), x);
    }
};

int main() {
    ll N, C; cin >> N >> C;
    vll h(N);
    rep(i, N) cin >> h[i];
    vll dp(N, 0);

    ConvexHullTrickAddMonotone<ll, true> cht;
    cht.add(-2 * h[0], h[0]*h[0] + dp[0]);

    for (int i = 1; i < N ; i++) {
        dp[i] = cht.query_monotone_inc(h[i]) + h[i] * h[i] + C;
        cht.add(-2 * h[i], h[i]*h[i] + dp[i]);
    }
    cout << dp[N - 1] << endl;
}


Measured memory_bytes: 5632