#pragma region
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
#include <map>
typedef unsigned long long ull;
typedef long long ll;
typedef unsigned int uint;
#define endl '\n'
using namespace std;
#if 1
#include <fstream>
ifstream fin("transport.in");
ofstream fout("transport.out");
#define cin fin
#define cout fout
#endif
#pragma endregion
int n, k;
int a[16003];
int mxvol = 0;
long long sum = 0;
bool Simulare(int c)
{
if (c < mxvol)
return false;
ll trans = 0;
ll s = 0;
for (int i = 0; i < n; i++)
{
if (s + a[i] > c)
{
trans++;
s = a[i];
continue;
}
s += a[i];
}
if (s != 0)
trans++;
return trans <= k;
}
int Cb()
{
int cant = INT_MAX;
int st = mxvol, dr = sum;
while (st <= dr)
{
int md = (st + dr) / 2;
if (Simulare(md))
{
dr = md-1;
cant = min(cant, md);
}
else
{
st = md+1;
}
}
return cant;
}
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> a[i];
mxvol = max(mxvol, a[i]);
sum += a[i];
}
cout << Cb();
}
//char sirr[1602];
//char stiva[1602];
//char fisiere[1602][1602];
//int main()
//{
//
// cin >> sirr;
// char* sir = sirr;
// int cntf = 0;
// while (*sir)
// {
// if (isupper(*sir))
// {
// char* inisir = sir;
// while (*sir != '(')
// sir++;
// sir++;
// *(sir - 1) = 0;
// strcat(stiva, inisir);
// strcat(stiva, "\\");
// }
// else if (islower(*sir))
// {
// char* inisir = sir;
// while (*sir != ')' && *sir!=',' && *sir)
// sir++;
// if (*sir == 0)
// continue;
// bool wasPar = *sir == ')';
// sir++;
// *(sir - 1) = 0;
// strcat(fisiere[cntf], stiva);
// strcat(fisiere[cntf], inisir);
// if (wasPar)
// --sir,;
// cntf++;
// }
// else if (*sir == ',')
// {
// sir++;
// }
// else if (*sir == ')')
// {
// char* lpos = strrchr(stiva, '\\');
// *lpos = 0;
// char* plpos = strrchr(stiva, '\\');
// *(plpos + 1) = 0;
// sir++;
// }
// }
// for (int i = 0; i < cntf; i++)
// {
// cout << fisiere[i] << endl;
// }
//}