#include <fstream>
using namespace std;
#define int long long
ifstream fin("euro.in");
ofstream fout("euro.out");
const int maxN = 35000, inf = (1LL << 60);
struct arbint {
int x, y;
}aint[4 * maxN];
int n, t, sp[maxN], dp[maxN];
void update(int nod, int st, int dr, int x, int y)
{
if(st == dr)
{
if(x * st + y > aint[nod].x * st + aint[nod].y)
aint[nod] = {x, y};
return;
}
int med = (st + dr) / 2;
bool ok1 = 0, ok2 = 0;
if(aint[nod].x * dr + aint[nod].y < x * dr + y)
ok2 = 1;
if(aint[nod].x * med + aint[nod].y < x * med + y)
{
ok1 = 1;
swap(aint[nod].x, x);
swap(aint[nod].y, y);
}
if(ok1 == ok2)
update(2 * nod, st, med, x, y);
else
update(2 * nod + 1, med + 1, dr, x, y);
}
int query(int nod, int st, int dr, int poz)
{
if(st == dr)
return aint[nod].x * poz + aint[nod].y;
int med = (st + dr) / 2, aux = aint[nod].x * poz + aint[nod].y;
if(poz <= med)
aux = max(aux, query(2 * nod, st, med, poz));
else
aux = max(aux, query(2 * nod + 1, med + 1, dr, poz));
return aux;
}
signed main()
{
fin >> n >> t;
for(int i = 1; i <= n; i++)
{
fin >> sp[i];
sp[i] += sp[i - 1];
}
for(int i = 1; i <= n; i++)
{
dp[i] = query(1, 1, n, i) + sp[i] * i - t;
update(1, 1, n, -sp[i], dp[i]);
}
fout << dp[n];
return 0;
}