// 提出時にassertはオフ #ifndef DEBUG #ifndef NDEBUG #define NDEBUG #endif #endif #include using namespace std; using ll = long long; #define ALL(x) (x).begin(), (x).end() template using vec = vector; int N, K; // 数列のすべての要素をnum以上にできればtrue // つまり答はnum以上になる bool isOK(vec &A, ll num){ // 前から順に足していく ll plus_sum = 0, plus_cnt = 0; for(int i = 1; i <= N; i++){ ll cur_num = A[i] + plus_sum; if(cur_num >= num) continue; ll cur_plus_cnt = (num - cur_num + i - 1) / i; plus_sum += cur_plus_cnt * i; plus_cnt += cur_plus_cnt; if(plus_cnt > K) return false; } return true; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> K; vec A(N + 1); for(int i = 1; i <= N; i++) cin >> A[i]; // 素直に答で二分探索できたな... ll l = 0, r = A[1] + K + 1; // lはOK,rはNG while(r - l > 1){ ll m = (r + l) / 2; if(isOK(A, m)) l = m; else r = m; } cout << l << "\n"; }