#include<iostream>
using namespace std;
long long a[1000010];
long long n, m, mid, num, r, l;
bool check(long long x) {
num = 0;
for (int i = 1; i <= n; i ++) {
if (x < a[i])
num += a[i] - x; // 累加看下以这个高度去锯 能锯出多长
}
if (num < m)
return true;
else
return false;
}
int main()
{
scanf("%lld %lld", &n, &m);
for (int i = 1; i <= n; i ++) {
scanf("%lld", &a[i]);
r = max(r, a[i]);
}
while (l <= r) {
mid = (l + r) >> 1;
if (check(mid)) // 如果是真,就说明高度高了
r = mid - 1;
else
l = mid + 1; // 说明高度矮了
}
cout << l-1; // 为什么要减一呢, 可能有些人会问,这是因为最后一次多加了一次 所以就要减掉
return 0;
}