#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 1e5+5;
int a[N];
bool check(int x);
int m,n,ans;
int main(){
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>a[i];
}
int l=1,r=1e9;
while (l<=r){
int mid=(l+r)/2;
if (check(mid)){
//ans=max(ans,mid);
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
cout<<ans;
}
bool check(int x){
int s=min(x,m);
for (int i=1;i<=n;i++){
if (a[i]-x<0){
s+=a[i]-x;
}
if (s<0)
return 0;
}
return 1;
}
//756768256
二分思想,将答案进行二分,关于初始左边界问题,不用考虑太多,直接找个大数,因为 ,二分遍历很快。
关于check函数,我们已经假定最多x套,如何判断其是否为可行解,可以根据joker的数量进行判断,joker的数量为m个,但注意,一共x套,所以使用joker的数量为min(m,x),令s=min(m,x),遍历数组,不够x个则s减去相应值,当s<0时则为不可行解