/*
二分答案
这个题目要求“体力和最小的那个小组的所有人的体力和尽量大”
很明显我们二分最小体力 如果合法 逐渐放大
但是这里我们二分的是最小而不是最大
所以累加的体力>=ans时 跳过当前体力i (可以认为把他归给了上一组)
累加和=0 继续分组
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define maxn 30010
#define inf 1000000000
using namespace std;
ll n,m,ans,a[maxn];
bool can(ll x)
{
ll tot=,s=;
for(int i=;i<=n;i++)
if(s+a[i]<x)s=s+a[i];
else
{
s=;tot++;
}
if(tot>=m)return ;
else return ;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
ll l=,r=inf;
while(l<=r)
{
ll mid=(l+r)/;
if(can(mid))
{
l=mid+;
ans=mid;
}
else r=mid-;
}
printf("%lld\n",ans);
return ;
}