1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<cmath>
6 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
7 #define maxn 50010
8
9 using namespace std;
10 typedef long long llg;
11
12 struct data{
13 llg x,y;
14 }s[maxn];
15 int n,L,d[maxn],l,r;
16 llg f[maxn],w[maxn];
17
18 int getint(){
19 int w=0;bool q=0;
20 char c=getchar();
21 while((c>‘9‘||c<‘0‘)&&c!=‘-‘) c=getchar();
22 if(c==‘-‘) c=getchar(),q=1;
23 while(c>=‘0‘&&c<=‘9‘) w=w*10+c-‘0‘,c=getchar();
24 return q?-w:w;
25 }
26
27 double xie(data a,data b){return (b.y-a.y)/(b.x-a.x);}
28 llg ji(llg x){return x*x;}
29
30 int main(){
31 File("a");
32 n=getint(); L=getint()+1;
33 for(int i=1;i<=n;i++){
34 w[i]=getint(); w[i]+=w[i-1];
35 while(l<r && xie(s[d[l]],s[d[l+1]])<(w[i]+i)*2) l++;
36 f[i]=f[d[l]]+ji(w[i]+i-w[d[l]]-d[l]-L);
37 s[i].x=w[i]+i; s[i].y=f[i]+ji(w[i]+i)+2*(w[i]+i)*L;
38 while(l<r && xie(s[d[r-1]],s[d[r]])>=xie(s[d[r]],s[i])) r--;
39 d[++r]=i;
40 }
41 printf("%lld",f[n]);
42 }