#include <bits/stdc++.h>
using namespace std;
ifstream f("euro.in");
ofstream g("euro.out");
const long long INF=1e17;
pair <long long,long long> arb[200005];
long long val (long long poz,pair <long long ,long long > func)
{
return poz*func.first+func.second;
}
void update (int st,int dr,int nod ,pair <long long,long long> line)
{
int mij=(st+dr)/2;
bool middle= val(mij,line) < val (mij,arb[nod]);
bool stanga= val(st,line) < val (st,arb[nod]);
if (middle==0)
{
swap(arb[nod],line);
}
if (st==dr)
{
return ;
}
if (stanga==middle)
{
update(st,mij,2*nod,line);
}
else
{
update(mij+1,dr,2*nod+1,line);
}
}
long long query (int st,int dr,int nod ,int poz)
{
if (st==dr)
{
return val(poz,arb[nod]);
}
long long mij=(st+dr)/2,valoare=val(poz,arb[nod]);
if (poz<=mij)
{
return max(valoare,query(st,mij,2*nod,poz));
}
else
{
return max(valoare,query(mij+1,dr,2*nod+1,poz));
}
}
int n,t;
long long din[100005],i,v[100005],s[100005];
int main()
{
f>>n>>t;
for (i=1;i<=n;i++)
{
f>>v[i];
}
for (i=1;i<=4*n;i++)
{
arb[i]={0,-INF};
}
for (i=1;i<=n;i++)
{
s[i]=s[i-1]+v[i];
din[i]=din[i-1]+v[i]*i;
din[i]=max(din[i],query(1,n,1,i)+s[i]*i-t);
update(1,n,1,{-s[i],din[i]});
}
g<<din[n];
return 0;
}