def isvalid(a, n, k, w, mid):
"""
Function to check whether the mid is the smallest minimum of the array
"""
ps = [0] * n
ans = 0
for i in range(n):
if i - 1 >= 0:
ps[i] += ps[i - 1]
if a[i] + ps[i] < mid:
e = mid - a[i] - ps[i]
ans += e
ps[i] += e
if i + w < n:
ps[i + w] -= e
# If it is true
return ans <= k
def maximizeMinHeight(n, k, w, a):
"""
Function to maximize the minimum height
"""
ans = 0
l, h = 0, 10 ** 14
while l <= h:
mid = (l + h) // 2
# Check for mid
if isvalid(a, n, k, w, mid):
l = mid + 1
ans = mid
else:
h = mid - 1
# Return the minimum height
return ans
if __name__ == '__main__':
N, K, W = 6, 2, 3
a = [2, 2, 2, 2, 1, 1]
# Function call
ans = maximizeMinHeight(N, K, W, a)
print(ans)