#include <bits/stdc++.h>
using
namespace
std;
bool
isMaximum(
int
mid,
int
A[],
int
N,
int
K)
{
if
(A[N - 1] >= mid)
return
1;
int
minOperations = 1e9;
for
(
int
i = 0; i < N - 1; i++) {
int
noOfOperations = 0;
for
(
int
j = i, offset = 0; j < N; j++, offset++) {
if
((mid - offset) > A[j])
noOfOperations
+= ((mid - offset) - A[j])
+ ((j == N - 1) ? 2e8 : 0);
else
break
;
}
minOperations = min(minOperations, noOfOperations);
}
return
minOperations <= K;
}
int
findLargestElement(
int
A[],
int
N,
int
K)
{
int
low = 1, high = *max_element(A, A + N) + K;
while
(high - low > 1) {
int
mid = (low + high) / 2;
if
(isMaximum(mid, A, N, K)) {
low = mid;
}
else
{
high = mid - 1;
}
}
if
(isMaximum(high, A, N, K))
return
high;
else
return
low;
}
int32_t main()
{
int
K = 4;
int
A[] = { 1, 3, 3 }, N = 3;
cout << findLargestElement(A, N, K) << endl;
int
K1 = 6;
int
A1[] = { 1, 3, 4, 5, 1 }, N1 = 5;
cout << findLargestElement(A1, N1, K1) << endl;
return
0;
}