砍树
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std;
const int maxn = 1000005;
long long n, m, h[maxn], ma;
long long tot;
long long f (long long l, long long r)
{
if (l == r) return l;
long long mid = (l + r) >> 1;
tot = 0;
for (int i = 1; i <= n ; i++) if (mid < h[i]) tot += h[i] - mid;
if (tot == m) return mid;
if (tot > m) f (mid + 1, r); else f (l, mid);
}
int main ()
{
scanf ("%lld %lld", &n, &m);
for (int i = 1; i <= n; i++) scanf ("%lld", &h[i]), ma = max (ma, h[i]);
printf ("%lld", f (0, ma));
return 0;
}