#define _CRT_SECURE_NO_WARNINGS
#define _CRT_DISABLE_PERFCRIT_LOCKS
#pragma GCC optimize("fast-math")
#pragma GCC optimize("no-stack-protector") 
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>

using namespace std;

#define v vector 
#define ll long long
#define umap unordered_map
#define uset unordered_set
#define f(array) (array).begin(), (array).end()
#define b(array) (array).rbegin(), (array).rend()

bool test(const v <int>& A, int k, ll maxSum) {
    int count = 1;
    ll curr = 0;

    for (int num : A) {
        if (curr + num > maxSum) {
            count++;
            curr = num;
            if (count > k) {
                return false;
            }
        } else {
            curr += num;
        }
    }
    return true;
}

signed main() { 
    cin.tie(nullptr), cout.tie(nullptr) 
    -> ios_base::sync_with_stdio(false);

    #define file "main"
    #ifndef ONLINE_JUDGE
            freopen (file ".inp", "r", stdin);
            freopen (file ".out", "w", stdout);
    #endif  

    int n, k;
    cin >> n >> k;
    v <int> A(n);
    ll left = 0, right = 0;

    for (int i = 0; i < n; i++) {
        cin >> A[i];
        left = max(left, (ll)A[i]);
        right += A[i];
    }

    ll result = right;
    while (left <= right) {
        ll mid = (left + right) / 2;
        if (test(A, k, mid)) {
            result = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }

    cout << result << endl;

    return 0;   
}