code:
#include "bits/stdc++.h"
using namespace std;
#define Long long long int
#define MAXN 50500
const Long INF=99999999999999;
Long Sum[MAXN],F[MAXN],L,N;
inline Long Sq(Long X){
return (X*X);
}
inline Long X(int j){
Long Num=(Sum[j-1]+j);
return Num;
}
inline Long Y(int j){
Long Num=Sq(Sum[j-1]+j)+F[j-1];
return Num;
}
inline Long K(int i){
Long Num=2*(Sum[i]+i-L);
return Num;
}
int H,T,Q[MAXN];
inline Long FacX(int i,int j){
Long Num=(X(i)-X(j));
return Num;
}
inline Long FacY(int i,int j){
Long Num=(Y(i)-Y(j));
return Num;
}
int main(void){
cin>>N>>L;
for(register int i=1;i<=N;i++)
cin>>Sum[i];
for(register int i=1;i<=N;i++)
Sum[i]+=Sum[i-1],F[i]=INF;
F[0]=0;
H=T=1,Q[1]=1;
for(register int i=1;i<=N;i++){
while(H<T&&FacY(Q[H+1],Q[H])<=FacX(Q[H+1],Q[H])*K(i))
H++;
register int j=Q[H];
F[i]=min(F[i],F[j-1]+Sq(i-j+Sum[i]-Sum[j-1]-L));
while(H<T&&FacX(Q[T],Q[T-1])*FacY(i,Q[T])<=FacX(i,Q[T])*FacY(Q[T],Q[T-1]))
T--;
Q[++T]=i;
}
cout<<F[N]<<endl;
return 0;
}