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

//#define getchar getchar_unlocked
//#define putchar putchar_unlocked
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define mp make_pair
#define ff first
#define ss second
#define err stderr
#define out stdout

typedef long long int ll;
typedef long double ld;
typedef short int sh;

inline void readI(int *i)
{
	register int t=0;
	register char z=getchar();
	int znak=1;
	if (z=='-')
	{
		znak=-1;
	}
	while ((z<'0') || ('9'<z))
	{
		z=getchar();
		if (z=='-')
		{
			znak=-1;
		}
	}
	while (('0'<=z) && (z<='9'))
	{
		t=(t<<3)+(t<<1)+z-'0';
		z=getchar();
	}
	*i=(t*znak);
}
inline void readUI(int *i)
{
	register int t=0;
	register char z=getchar();
	while ((z<'0') || ('9'<z))
	{
		z=getchar();
	}
	while (('0'<=z) && (z<='9'))
	{
		t=(t<<3)+(t<<1)+z-'0';
		z=getchar();
	}
	*i=t;
}
inline void readL(ll *l)
{
	register ll t=0;
	register char z=getchar();
	int znak=1;
	if (z=='-')
	{
		znak*=-1;
	}
	while ((z<'0') || ('9'<z))
	{
		z=getchar();
		if (z=='-')
		{
			znak=-1;
		}
	}
	while (('0'<=z) && (z<='9'))
	{
		t=(t<<3)+(t<<1)+z-'0';
		z=getchar();
	}
	*l=(t*znak);
}
inline void readUL(ll *l)
{
	register ll t=0;
	register char z=getchar();
	while ((z<'0') || ('9'<z))
	{
		z=getchar();
	}
	while (('0'<=z) && (z<='9'))
	{
		t=(t<<3)+(t<<1)+z-'0';
		z=getchar();
	}
	*l=t;
}
inline void writeL(ll l)
{
	if (l==0)
	{
		putchar(48);
	}
	else
	{
		if (l<0)
		{
		   l*=-1;
		   putchar(45);
		}
		int _tab[21];
		int wsk=0;
		while (l>0)
		{
			++wsk;
			_tab[wsk]=(l%10)+48;
			l/=10;
		}
		for (int j=wsk; j>=1; --j)
		{
			putchar(_tab[j]);
		}
	}
}
inline void writeS(string s)
{
	int l=s.length();
	for (int i=0; i<l; ++i)
	{
		putchar(s[i]);
	}
}
inline void space()
{
	putchar(32);
}
inline void endl()
{
	putchar(10);
}

#define debug if(0)
#define debug2 if(0)
#define debug3 if(1)
#define debug4 if(1)
#define MAXN (int)(2e5)+5
#define ZAK (1<<21)+5

int n, R;
ll c;
ll h[MAXN];
ll dp[MAXN];
struct funkcja
{
	ll a;
	ll b;
};
funkcja tree[ZAK];
ll INF=(1e18);

bool operator == (funkcja f1, funkcja f2)
{
	return (f1.a==f2.a && f1.b==f2.b);
}
bool operator != (funkcja f1, funkcja f2)
{
	return (f1.a!=f2.a || f1.b!=f2.b);
}

ll wartosc(funkcja func, ll arg)
{
	return func.a*arg+func.b;
}
ll query(int x)
{
	ll arg=x;
	x+=R-1;
	ll war=INF;
	while (x)
	{
		war=min(war, wartosc(tree[x], arg));
		debug
		{
			fprintf (err, "QUERY x=%d tree[x]=(%lld, %lld) war=%lld\n", x, tree[x].a, tree[x].b, war);
		}
		x>>=1;
	}
	return war;
}
funkcja mini(funkcja f1, funkcja f2, ll arg)
{
	ll wyn1=wartosc(f1, arg);
	ll wyn2=wartosc(f2, arg);
	debug2
	{
		fprintf (err, "f1=(%lld, %lld) wyn1=%lld     f2=(%lld, %lld) wyn2=%lld\n", f1.a, f1.b, wyn1, f2.a, f2.b, wyn2);
	}
	return (wyn1<=wyn2 ? f1 : f2);
}
void insert(int x, int pp, int pk, funkcja func)
{
	if (pp==pk)
	{
		tree[x]=mini(func, tree[x], pp);
		debug
		{
			fprintf (err, "INSERT x=%d tree[x]=(%lld, %lld)\n", x, tree[x].a, tree[x].b);
		}
		return;
	}
	int sr=((pp+pk)>>1);
	funkcja lewa=mini(func, tree[x], pp);
	funkcja prawa=mini(func, tree[x], pk);
	funkcja s0=mini(func, tree[x], sr);
	debug
	{
		fprintf (err, "INSERT x=%d pp=%d pk=%d sr=%d  tree[x]=(%lld, %lld) func=(%lld, %lld) lewa=(%lld, %lld) s0=(%lld, %lld) prawa=(%lld, %lld)\n", x, pp, pk, sr, tree[x].a, tree[x].b, func.a, func.b, lewa.a, lewa.b, s0.a, s0.b, prawa.a, prawa.b);
	}
	if (lewa==s0)
	{
		funkcja pom;
		if (wartosc(func, sr)<=wartosc(tree[x], sr))
		{
			pom=tree[x];
			tree[x]=func;
		}
		else
		{
			pom=func;
		}
		insert(x<<1|1, sr+1, pk, pom);
	}
	else
	{
		funkcja pom;
		if (wartosc(func, sr+1)<=wartosc(tree[x], sr+1))
		{
			pom=tree[x];
			tree[x]=func;
		}
		else
		{
			pom=func;
		}
		insert(x<<1, pp, sr, pom);
	}
	debug
	{
		fprintf (err, "	x=%d tree[x]=(%lld, %lld)\n", x, tree[x].a, tree[x].b);
	}
}
int main()
{
	readUI(&n);
	R=1;
	while (R<(int)(1e6))
	{
		R<<=1;
	}
	readUL(&c);
	for (int i=1; i<=n; ++i)
	{
		readUL(&h[i]);
		if (i>1)
		{
			h[i]-=h[1];
		}
	}
	h[1]=0;
	for (int i=2; i<=n; ++i)
	{
		dp[i]=query(h[i])+c+h[i]*h[i];
		funkcja func={(-2)*h[i], dp[i]+h[i]*h[i]};
		insert(1, 1, R, func);
		debug
		{
			fprintf (err, "i=%d dp[i]=%lld\n\n", i, dp[i]);
		}
	}
	fprintf (out, "%lld\n", dp[n]);
	return 0;
}
/*
5 6
1 2 3 4 5

20 80
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 21 22 27
*/



Measured memory_bytes: 36096