#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("transport.in");
ofstream fout("transport.out");
int main()
{
int n , klim,kmax,i;
fin >> n >> klim; //e superb Dumnezeu
int v[n + 1];
int vmax = 0;
for(i = 1;i <= n;i++)
{
fin >> v[i];
//computam volumul maxim ca find suma tuturor saltelelor
vmax += v[i];
}
int arraykslim = log2(vmax) + 2 ;
int ks[arraykslim];
bool found = 0;
int st = 1, dr = vmax , mid,kcurent = 1 ,chgvol = 0 , cnt = 0;
while (found == 0) //cautam binar solutia minima dupa criteriul kcurent < = klim
{ chgvol = 0;
mid = (st + dr)/2;
cnt++; //pasul cb
for ( int i = 1;i <= n;i++) //mid = volum curent
{
if((chgvol + v[i]) <= mid)
{
chgvol += v[i];
}
if ((chgvol + v[i]) > mid)
{
chgvol = 0;
kcurent++;
}
}
ks[cnt] = kcurent;
kcurent = 1;
//aici avem kcurent salvat
if(ks[cnt] <= klim)
{
dr = mid;
}
if(ks[cnt] > klim)
{
st = mid;
}
if ( st == dr - 1)
{
found = 1;
}
}
int kst = 1 , kdr = 1;
chgvol = 0;
for ( int i = 1;i <= n;i++)
{
if((chgvol + v[i]) <= st)
{
chgvol += v[i];
}
if ((chgvol + v[i]) > st)
{
chgvol = 0;
kst++;
}
}
for ( int i = 1;i <= n;i++) //mid = volum curent
{
if((chgvol + v[i]) <= dr)
{
chgvol += v[i];
}
if ((chgvol + v[i]) > dr)
{
chgvol = 0;
kdr++;
}
}
if(kst <= klim)
{
fout << kst ;
}
else if (kdr <= klim)
{
fout << kdr;
} // o dam la sto
return 0;
}