#include <bits/stdc++.h>
using namespace std;
const int MAX = 100000;
long long arrPilas[MAX];
long iEstudiantes, iUltimaCaja;
long long iCajasTotales;
bool esPosible(long long iTiempoTotal) {
  long long iPosFinal = iUltimaCaja;
  long long iCasilla;
  long long iCajas = iCajasTotales;
  long long iTiempoLocal;
  iCasilla = arrPilas[iPosFinal];
  for (long long i = 0; i < iEstudiantes; i++) {
    iTiempoLocal = iTiempoTotal;
    if ((iPosFinal + 1) < iTiempoLocal) {
      iTiempoLocal -= (iPosFinal + 1);
    } else {
      iTiempoLocal = 0;
    }
    while (iTiempoLocal > 0) {
      if (iCajas <= 0) {
        return true;
      }
      if (iCasilla <= iTiempoLocal) {
        iCajas -= iCasilla;
        iTiempoLocal -= iCasilla;
        iCasilla = 0;
      } else {
        iCajas -= iTiempoLocal;
        iCasilla -= iTiempoLocal;
        iTiempoLocal = 0;
      }
      if (iCasilla == 0) {
        while (iCasilla == 0 && iPosFinal > 0) {
          iPosFinal--;
          iCasilla = arrPilas[iPosFinal];
        }
      }
    }
  }
  if (iCajas <= 0) {
    return true;
  } else {
    return false;
  }
}
long long busqueBinaria() {
  long long iLow = iUltimaCaja + 1;
  long long iHigh = iLow + iCajasTotales;
  long long iMedio;
  while (iHigh >= iLow) {
    iMedio = (iHigh + iLow) / 2;
    if (esPosible(iMedio)) {
      iHigh = iMedio - 1;
    } else {
      iLow = iMedio + 1;
    }
  }
  if (esPosible(iLow)) {
    return iLow;
  } else if (esPosible(iHigh)) {
    return iHigh;
  }
}
int main() {
  long iPilas, iTemp;
  long long iTiempo;
  cin >> iPilas >> iEstudiantes;
  for (long long i = 0; i < iPilas; i++) {
    cin >> iTemp;
    iCajasTotales += iTemp;
    arrPilas[i] = iTemp;
    if (iTemp != 0) {
      iUltimaCaja = i;
    }
  }
  iTiempo = busqueBinaria();
  cout << iTiempo;
}
