#include<iostream>
using namespace std;
#define MAX 100000+200
long long wei[MAX];
long long n,m;
/* 袋子的最小值是最大一堆果子的体积,最大值是所有果子的体积
函数 参数是此时袋子的体积v
*/
long long split(long long v)
{
long long num = 1,hold =0;//num存放已使用多少个袋子,hold表示当前袋子已经装了多少
for(long i=0;i<n;i++)
{
hold += wei[i];
if(hold>v)
{
num++;
hold = wei[i];
}
}
return num; //返回所使用袋子的个数
}
void solve(long long l,long long h)
{
long long lw = l,hw = h,mw ;
for(int i=0;i<300;i++)
{
mw = (lw+hw)/2;
if(split(mw)>m)
{
lw = mw;
}else{
hw = mw;
}
}
cout<<hw<<endl;
}
int main()
{
long long sumw = 0,maxw = 0;
cin>>n>>m;//m袋子的总个数,n是果树的总个数
for(long i=0;i<n;i++)
{
cin>>wei[i];
sumw+=wei[i];
maxw = max(maxw,wei[i]);
}
solve(maxw,sumw);
return 0;
}