#include <bits/stdc++.h>
#define MAX 100010
using namespace std;
bool judge(int mid, int a[], int n, int m)
{
int i,sum=0,t=0;
for(i=0;i<n;i++)
{
if(sum+a[i]>mid) //如果前几个月加上这个月的钱大于这次尝试的fajo月开销,那么说明这个月的钱应该放在下个fajo月里
{
sum=a[i];
t++; //找到一个fajo月
}
else sum+=a[i]; // 否则就加上这个月
}
//如果按照mid的分割方法,最大分割出t个月大于m,则可以继续增加开销,
// 注意,这里是说,最少分出的月份是t,那么t>=m,则可以继续增加开销,以便使t变小
if(t>=m) return true;
else return false;
}
int main()
{
int total=0, max=0, a[MAX], n, m, i;
cin>>n>>m;
for(i=0;i<n;i++)
{
cin>>a[i];
total+=a[i]; //记录开销的总和
if(max<a[i]) max=a[i]; //记录开销的最大值
}
int l=max, r=total, mid;
while(l<=r)
{
mid=(l+r)/2;
if(judge(mid,a,n,m)) l=mid+1; //如果可以按照要求分,就说明fajo月的开销可以变大一点
else r=mid-1; // 如果不可以,则说明fajo月开销应该变小
}
cout<<mid<<endl;
return 0;
}