#include <cstdio>
#include <iostream>
#define DIMN 100010
#define INF 1000000000000000000
using namespace std;
struct idk{
long long x,y;
} aint[4*DIMN];
void update (int nod,int st,int dr,long long x,long long y){
if (st == dr){
if (aint[nod].x * st + aint[nod].y < x * st + y){
aint[nod].x = x;
aint[nod].y = y;
}
return;
}
int mid = (st+dr)/2,st1=0,st2=0;
if (aint[nod].x * mid + aint[nod].y < x * mid + y)
st1 = 1;
if (aint[nod].x * dr + aint[nod].y < x * dr + y)
st2 = 1;
if (!st1 && !st2){
update (2*nod,st,mid,x,y);
}
else if (!st1 && st2) {
update (2*nod+1,mid+1,dr,x,y);
}
else if (st1 && !st2){
swap(x,aint[nod].x);
swap(y,aint[nod].y);
update (2*nod+1,mid+1,dr,x,y);
}
else if (st1 && st2){
swap(x,aint[nod].x);
swap(y,aint[nod].y);
update (2*nod,st,mid,x,y);
}
}
long long query (int nod,int st,int dr,int x){
if (st==dr){
return aint[nod].x * x + aint[nod].y;
}
int mid = (st+dr)/2;
long long sol = -INF;
if (x<=mid)
sol = query(2*nod,st,mid,x);
else sol = query(2*nod+1,mid+1,dr,x);
return max(sol , aint[nod].x * x + aint[nod].y);
}
int main()
{
FILE *fin=fopen ("euro.in","r");
FILE *fout=fopen ("euro.out","w");
int n,t,i,x;
long long sp=0,sol;
fscanf (fin,"%d%d",&n,&t);
t = -t;
update (1,1,n,0,0);
for (i=1;i<=n;i++){
fscanf (fin,"%d",&x);
sp+=x;
sol = query(1,1,n,i) + sp * i + t;
update (1,1,n,-sp,sol);
}
fprintf (fout,"%lld",sol);
return 0;
}