#include <bits/stdc++.h>

using namespace std;

#define PB	push_back
#define ALL(x)	(x).begin(), (x).end()
#define ALLR(x)	(x).rbegin(), (x).rend()
#define MP	make_pair

#define debug(args...) { string _s = #args; replace(ALL(_s), ',', ' '); stringstream ss(_s); cerr << endl;_debug(ss, args); }
#define _rg auto it = next(v.begin()); it != v.end(); it++
#define _input ostream& operator <<(ostream& out

template<typename T, typename U>
_input, const pair<T, U>& p) {
	out << "(" << p.first << ", " << p.second << ")";
	return out;
}

#define cont(c) template<typename T> _input, const c<T>& v) { \
					if (v.empty()) return out; \
					out << "[" << *v.begin(); \
					for (_rg) out << ", " << *it; \
					out << "]"; return out; \
				}
				
#define cont2(c) template<typename T, typename U> _input, const c<T, U>& v) { \
					if (v.empty()) return out; \
					out << "[" << *v.begin(); \
					for (_rg) out << ", " << *it; \
					out << "]"; return out; \
				}

cont(vector) cont(set) cont(multiset) cont(queue) cont2(map)

template<typename T, size_t n, typename= enable_if_t<!is_same<T, char>::value>>
_input, const T(&v)[n]) {
	if (n == 0) return out;
	out << "[" << v[0];
	for (int i = 1; i < (int)n; i++) out << ", " << v[i];
	out  << "]"; return out;
}

template<typename T, typename... Ts>
void _debug(stringstream& ss, const T &arg) {
	string name; ss >> name;
	cerr << name << " = " << arg << endl;
}

template<typename T, typename... Ts>
void _debug(stringstream& ss, const T& arg, const Ts&... args) {
	string name; ss >> name; 
	cerr << name << " = " << arg << ", ";
	if (is_class<T>::value || is_array<T>::value) cerr << endl;
	_debug(ss, args...);
}

#define FAST_IO ios::sync_with_stdio(false); cin.tie(0)

#define int long long int

typedef pair<int, int> ii;
typedef pair<pair<int, int>, int> iii;
typedef vector<int> vi;
typedef vector<iii> viii;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef unsigned long long ull;

const int INF = LONG_LONG_MAX>>1;
const int NINF = LONG_LONG_MIN/2;
const double PI = 3.141592653589793238;

/*
 * y = a*x + b
 * y = a2*x + b2
 * for intersection : a*x + b = a2*x + b2
 * x = (b2 - b) / (a2 - a) 
 */

struct Line {
	int a, b;
	int value(int x) {
		return a*x + b;
	}
	
	ii inter(const Line& he) const {
		int one = he.b - b;
		int two = a - he.a;
		if (two < 0) {
			one *= -1;
			two *= -1;
		}
		return {one, two};
	}
};

inline int square(int x) {
	return x*x;
}

int32_t main() {
	FAST_IO;
	
	int n, C;
	cin >> n >> C;
	vi h(n);
	for (int& x: h) cin >> x;
	
	vector<Line> lines;
	int start = 0;
	for (int i = 0; i < n; i++) {
		while(start <= (int) lines.size() -1) {
			Line A = lines[start];
			Line B = lines[start + 1];
			if (A.value(h[i]) >= B.value(h[i])) {
				++start;
			} else {
				break;
			}
		}
		
		int best = 0;
		if (i != 0) {
			best = lines[start].value(h[i]) + square(h[i]) + C;
		}
		Line line{-2 * h[i], best + square(h[i])};
		
		while (start <= (int) lines.size() - 2) {
			Line A = lines.end()[-2];
			Line B = lines.end()[-1];
			ii one = A.inter(B);
			ii two = B.inter(line);
			
			if ((__int128)one.first * two.second >= (__int128)one.second*two.first) {
				lines.pop_back();
			} else {
				break;
			}
		}
		lines.push_back(line);
		
		if (i == n-1) {
			cout << best << endl;
		}
	}
}
// g++ -Wall -Wextra -Wshadow -fsanitize=undefined -std=c++17


Measured memory_bytes: 7920