inline ll __read() { ll x(0), t(1); charo(getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) x = (x << 1) + (x << 3) + (o ^ 48); return x * t; }
ll n, m, w, a[maxn]; ll CF[maxn], temp[maxn]; ll l(0x7fffffff), r, ans;
inlineboolCheck(ll x) { memcpy(temp + 1, CF + 1, sizeof(ll) * n); ll now(0), rest(m); for (ll i = 1; i <= n; ++i) { now += temp[i]; if (now >= x) continue; if (now + rest < x) return0; ll get = x - now; rest -= get; now += get; if (i + w <= n) temp[i + w] -= get; } return1; }
signedmain() { n = __read(), m = __read(), w = __read(); for (ll i = 1; i <= n; ++i) { a[i] = __read(); CF[i] = a[i] - a[i - 1]; l = min(l, a[i]), r = max(r, a[i]); } r += m; while (l <= r) { ll mid = (l + r) >> 1; if (Check(mid)) ans = mid, l = mid + 1; else r = mid - 1; } printf ("%lld\n", ans); system("pause"); }