#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Hàm kiểm tra tính khả thi và tính toán cost còn lại
pair<bool, long long> isPossible(const vector<long long>& heights, int n, long long T, long long targetHeight) {
long long cost = 0; // Chi phí tổng
vector<long long> newHeights(heights); // Chiều cao sau khi giảm
for (int i = 0; i < n; i++) {
if (newHeights[i] > targetHeight) {
cost += newHeights[i] - targetHeight;
newHeights[i] = targetHeight;
}
}
for (int i = 1; i < n; i++) {
if (abs(newHeights[i] - newHeights[i - 1]) > 1) {
return {false, T}; // Không khả thi, trả về T
}
}
return {cost <= T, T - cost}; // Trả về cost còn lại nếu khả thi
}
int main() {
int n;
long long T;
cin >> n >> T;
vector<long long> heights(n);
for (int i = 0; i < n; i++) {
cin >> heights[i];
}
long long low = -1e15, high = 1e15;
long long result = -1e15;
long long remainingCost = 0;
// Tìm kiếm nhị phân
while (low < high) {
long long mid = low + (high - low) / 2;
auto [possible, costLeft] = isPossible(heights, n, T, mid);
if (possible) {
// result = mid;
remainingCost = costLeft; // Lưu lại cost còn dư
high = mid;
} else {
low = mid + 1; // Cố gắng tìm chiều cao thấp hơn
}
// cout << "mid: " << mid << " possible: " << possible << " costLeft: " << costLeft << endl;
}
result = low;
// Xử lý các case bổ sung
if (remainingCost >= 3 && n >= 2) {
// Giảm ô đầu thêm 2, ô thứ hai thêm 1
result = result - 2;
} else if (remainingCost > 0 && n >= 1) {
// Giảm ô đầu thêm 1
result = result - 1;
}
// cout << "Chiều cao tối thiểu: " << result << endl;
// cout << "Cost còn lại: " << remainingCost << endl;
cout << result << endl;
return 0;
}