//存在一个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(); }