#include<bits/stdc++.h>
using namespace std;
int n,m;
long long a[100010],sum,maxx;
int f(int x){
int cnt=1;//分的段数
long long s=0;//该子段的和
for(int i=1;i<=n;i++){
if(s+a[i]<=x) s+=a[i];//和小于等于x继续添加
else{//否则表示当前段结束,新段开始
cnt++;
s=a[i];
}
}
return cnt;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
maxx=max(maxx,a[i]);
sum+=a[i];
}
long long l=maxx,r=sum;//设置答案的上界和下界,分别是最大元素和总和
while(l<r){
long long mid=(l+r)/2;//取中心靠右端点
if(f(mid)>m) l=mid+1;//x取得过小分的段数过多,不可能是答案
else r=mid;//可能是答案但也可能有更优解
}
printf("%lld",l);
return 0;
}