#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; #define maxn 511111 long long sum[maxn]; long long dp[maxn]; int n, m; long long a[maxn]; int que[maxn], head, tail; long long up (int i, int j) { return dp[i]+sum[i]*sum[i] - dp[j]-sum[j]*sum[j]; } long long down (int i, int j) { return 2*(sum[i]-sum[j]); } int main () { while (cin >> n >> m) { for (int i = 1; i <= n; i++) cin >> a[i]; sum[0] = 0; for (int i = 1; i <= n; i++) sum[i] = sum[i-1]+a[i]; head = tail = 0; que[tail++] = 0; for (int i = 1; i <= n; i++) { while (head+1<tail && up (que[head+1], que[head]) <= sum[i]*down (que[head+1], que[head])) head++; int j = que[head]; dp[i] = dp[j] + (sum[i]-sum[j])*(sum[i]-sum[j]) + m; while (head+1<tail && up (i, que[tail-1])*down (que[tail-1], que[tail-2]) <= up (que[tail-1], que[tail-2])*down (i, que[tail-1])) tail--; que[tail++] = i; } printf ("%lld\n", dp[n]); } return 0; }