//存在一个k,i<j<k,且q[k]<q[i]<q[j]
//就不能放在一个栈内
//然后枚举一下所有的i j
//如果满足上面的条件,就连一条边
//然后判断是不是二分图
//左边是第一个栈,右边是第二个栈
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=4e5+10;
#define int long long
typedef long long ll;
inline ll read()
{
ll x=0,w=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') w=-1;
c=getchar();
}
while(c<='9'&&c>='0')
{
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return w==1?x:-x;
}
ll n,k,a[N],pre[N],mx,t[N],pre2[N];
void solve()
{
ll n=read();
ll k=read();
for(int i=1; i<=n ; i++)
a[i]=read(),a[n+i]=a[i];//破环成链
for(int i=1; i<=2*n; i++)
t[i]=a[i]*(a[i]+1)/2;//这个单位的价值
for(int i=1; i<=2*n ; i++)
//处理单个的价值 整个的价值
pre[i]=pre[i-1]+a[i],pre2[i]=pre2[i-1]+t[i];
//枚举终点
for(int i=n+1; i<=2*n; i++)
{
int l=i-n,r=i+1;
//二分查找起点
while(l<r)
{
int mid=(l+r)>>1;
ll x=pre[i]-pre[mid-1];
//说明天数不够
if(x<=k)
r=mid;
else
l=mid+1;//天数太多了
}
//直接选取的整块的 正与的天数
ll p=pre2[i]-pre2[l-1],p2=k-(pre[i]-pre[l-1]);
ll res=a[l-1];
p+=(res+res-p2+1)*p2/2;
mx=max(mx,p);
}
cout<<mx<<endl;
}
signed main()
{
int t=1;
while(t--)
solve();
}