// FMI - Grupa 135 - Semigrupa 2 - Hareza Andrei
// Include
#include <fstream>
using namespace std;
// Constante
const int sz = 16003;
// Functii
int bSearch(int left, int right);
bool valide(int size);
template<class T> int binarySearch(T *data, int left, int right, T value, bool (*comp)(T a, T b));
template<class T> int binarySearchA(T *data, int left, int right, T value, bool (*comp)(T a, T b));
bool lowerEqual(int a, int b) { return a<=b;}
// Variabile
ifstream in("transport.in");
ofstream out("transport.out");
int num, maxMoves;
int sum[sz];
// Main
int main()
{
in >> num >> maxMoves;
for(int i=1 ; i<=num ; ++i)
{
in >> sum[i];
sum[i] += sum[i-1];
}
out << bSearch(1, sz*sz) << '\n';
in.close();
out.close();
return 0;
}
int bSearch(int left, int right)
{
if(left == right)
return left;
int mid = (left+right) / 2;
if(valide(mid))
return bSearch(left, mid);
else
return bSearch(mid+1, right);
}
bool valide(int size)
{
int current = 0;
int pos = 0;
for(int i=1 ; i<=maxMoves ; ++i)
{
pos = binarySearch(sum, pos+1, num, current+size, lowerEqual);
if(sum[pos] != current+size)
--pos;
if(pos == num)
return true;
current = sum[pos];
}
return false;
}
template<class T> int binarySearch(T *data, int left, int right, T value, bool (*comp)(T a, T b))
{
int lft = data[left-1];
int rgh = data[right+1];
data[left-1] = -2147483647;
data[right+1] = 2147483647;
int ans = binarySearchA(data, left-1, right+1, value, comp);
data[left-1] = lft;
data[right+1] = rgh;
return ans;
}
template<class T> int binarySearchA(T *data, int left, int right, T value, bool (*comp)(T a, T b))
{
if(left == right)
return left;
int mid = (left+right)/2;
if(comp(value, data[mid]))
return binarySearchA(data, left, mid, value, comp);
else
return binarySearchA(data, mid+1, right, value, comp);
}