Tuesday, 19 Oct 2021

# Maximize the smallest array element by incrementing all elements in a K-length subarray by 1 exactly M times

Given an array arr[] of size N, and integers M and K, the task is to find the maximum possible value of the smallest array element by performing M operations. In each operation, increase the value of all elements in a contiguous subarray of length K by 1.Examples:Input: arr[ ] = {2, 2, 2, 2, 1, 1}, M = 1, K = 3Output: 2Explanation: Update the last 3 elements on the first move then updated array is [2, 2, 2, 3, 2, 2]. The smallest element has a value of 2.Input: arr[ ] = {5, 8}, M = 5, K = 1Output: 9Approach: The problem can be solved by using Binary Search. Traverse the array arr[] and for every element arr[i], count the number of operations required. If the current element is required to be updated x times, then add x to the answer and update the consecutive segment of length K by x times.Below is the implementation of the above approach:C++#include using namespace std;#define ll long longll n, m, k, l, r, i;  ll check(ll v, vector& a){    ll tec = 0, ans = 0;              vector b(n + k + 1);      for (i = 0; i < n; i++) {                  tec -= b[i];          if (a[i] + tec < v) {                          ll mov = v - a[i] - tec;            ans = ans + mov;                                      tec += mov;            b[i + k] = mov;        }    }              return (ans 0) {          ll tm = (l + r + 1) / 2;          if (check(tm, a))            l = tm;        else            r = tm - 1;    }    return l;}  int main(){        vector a{ 2, 2, 2, 2, 1, 1 };    m = 2;    k = 3;    n = a.size();          cout