#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
template<typename T>
bool minimize(T& a, const T& b) {
if (a < b) return false;
a = b;
return true;
}
template<typename T>
bool maximize(T& a, const T& b) {
if (b < a) return false;
a = b;
return true;
}
const int N = 15e3 + 5;
const int MAX_SZ = 3e4 + 5;
int n, k;
int a[N];
int pref[N];
int f[N]; // f[i] = số đoạn nhỏ nhất (min_k) có thể chia của đoạn [1, i]
int g[N]; // g[i] = số đoạn lớn nhất (max_k) có thể chia của đoạn [1, i]
int ft1[MAX_SZ], ft2[MAX_SZ];
void init() {
for (int i = 1; i <= 2 * (n + 1); i++) {
ft1[i] = INF;
ft2[i] = -INF;
}
}
void update1(int i, int val) {
for (; i > 0; i -= i & (-i)) minimize(ft1[i], val);
}
int get1(int i) {
int ans = INF;
for (; i <= 2 * (n + 1); i += i & (-i)) minimize(ans, ft1[i]);
return ans;
}
void update2(int i, int val) {
for (; i > 0; i -= i & (-i)) maximize(ft2[i], val);
}
int get2(int i) {
int ans = -INF;
for (; i <= 2 * (n + 1); i += i & (-i)) maximize(ans, ft2[i]);
return ans;
}
bool check(int M) {
for (int i = 1; i <= n; i++) {
f[i] = INF;
g[i] = -INF;
}
f[0] = g[0] = 0;
// sum[j + 1, i] <= M
// <=> pref[i] - pref[j] <= M
// <=> pref[j] >= pref[i] - M
vector<int> vals;
for (int i = 0; i <= n; i++) {
vals.push_back(pref[i]);
vals.push_back(pref[i] - M);
}
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
init();
for (int i = 0; i <= n; i++) {
// for (int j = 0; j < i; j++) {
// if (pref[j] >= pref[i] - M) {
// minimize(f[i], f[j] + 1);
// maximize(g[i], g[j] + 1);
// }
// }
// giá trị nén của pref[i] - M
int val_i = lower_bound(vals.begin(), vals.end(), pref[i] - M) - vals.begin() + 1;
minimize(f[i], get1(val_i) + 1);
maximize(g[i], get2(val_i) + 1);
// giá trị nén của pref[i]
val_i = lower_bound(vals.begin(), vals.end(), pref[i]) - vals.begin() + 1;
update1(val_i, f[i]);
update2(val_i, g[i]);
}
return (f[n] <= k && k <= g[n]);
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i], pref[i] = pref[i - 1] + a[i];
int l = -1e9, r = 1e9, ans = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
r = mid - 1;
}
else {
l = mid + 1;
}
}
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpib29sIG1pbmltaXplKFQmIGEsIGNvbnN0IFQmIGIpIHsKCWlmIChhIDwgYikgcmV0dXJuIGZhbHNlOwoJYSA9IGI7IAoJcmV0dXJuIHRydWU7IAp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpib29sIG1heGltaXplKFQmIGEsIGNvbnN0IFQmIGIpIHsKCWlmIChiIDwgYSkgcmV0dXJuIGZhbHNlOyAKCWEgPSBiOyAKCXJldHVybiB0cnVlOyAKfQoKY29uc3QgaW50IE4gPSAxNWUzICsgNTsgCmNvbnN0IGludCBNQVhfU1ogPSAzZTQgKyA1OyAKCmludCBuLCBrOyAKaW50IGFbTl07ICAKaW50IHByZWZbTl07ICAKCmludCBmW05dOyAvLyBmW2ldID0gc+G7kSDEkW/huqFuIG5o4buPIG5o4bqldCAobWluX2spIGPDsyB0aOG7gyBjaGlhIGPhu6dhIMSRb+G6oW4gWzEsIGldCmludCBnW05dOyAvLyBnW2ldID0gc+G7kSDEkW/huqFuIGzhu5tuIG5o4bqldCAobWF4X2spIGPDsyB0aOG7gyBjaGlhIGPhu6dhIMSRb+G6oW4gWzEsIGldCgppbnQgZnQxW01BWF9TWl0sIGZ0MltNQVhfU1pdOyAKCnZvaWQgaW5pdCgpIHsKCWZvciAoaW50IGkgPSAxOyBpIDw9IDIgKiAobiArIDEpOyBpKyspIHsKCQlmdDFbaV0gPSBJTkY7IAoJCWZ0MltpXSA9IC1JTkY7IAoJfQp9Cgp2b2lkIHVwZGF0ZTEoaW50IGksIGludCB2YWwpIHsKCWZvciAoOyBpID4gMDsgaSAtPSBpICYgKC1pKSkgbWluaW1pemUoZnQxW2ldLCB2YWwpOyAKfQoKaW50IGdldDEoaW50IGkpIHsKCWludCBhbnMgPSBJTkY7ICAKCWZvciAoOyBpIDw9IDIgKiAobiArIDEpOyBpICs9IGkgJiAoLWkpKSBtaW5pbWl6ZShhbnMsIGZ0MVtpXSk7IAoJcmV0dXJuIGFuczsgCn0KCnZvaWQgdXBkYXRlMihpbnQgaSwgaW50IHZhbCkgewoJZm9yICg7IGkgPiAwOyBpIC09IGkgJiAoLWkpKSBtYXhpbWl6ZShmdDJbaV0sIHZhbCk7IAp9CgppbnQgZ2V0MihpbnQgaSkgewoJaW50IGFucyA9IC1JTkY7ICAKCWZvciAoOyBpIDw9IDIgKiAobiArIDEpOyBpICs9IGkgJiAoLWkpKSBtYXhpbWl6ZShhbnMsIGZ0MltpXSk7IAoJcmV0dXJuIGFuczsgCn0KCmJvb2wgY2hlY2soaW50IE0pIHsKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWZbaV0gPSBJTkY7ICAgCgkJZ1tpXSA9IC1JTkY7ICAKCX0gICAKCWZbMF0gPSBnWzBdID0gMDsgICAKCgkvLyAgICAgc3VtW2ogKyAxLCBpXSA8PSBNICAKCS8vIDw9PiBwcmVmW2ldIC0gcHJlZltqXSA8PSBNIAoJLy8gPD0+IHByZWZbal0gPj0gcHJlZltpXSAtIE0gCgoJdmVjdG9yPGludD4gdmFsczsgICAKCWZvciAoaW50IGkgPSAwOyBpIDw9IG47IGkrKykgewoJCXZhbHMucHVzaF9iYWNrKHByZWZbaV0pOyAgCgkJdmFscy5wdXNoX2JhY2socHJlZltpXSAtIE0pOyAKCX0KCglzb3J0KHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSk7ICAKCXZhbHMucmVzaXplKHVuaXF1ZSh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpIC0gdmFscy5iZWdpbigpKTsgIAoKCWluaXQoKTsgIAoKCWZvciAoaW50IGkgPSAwOyBpIDw9IG47IGkrKykgewoJCS8vIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CgkJLy8gCWlmIChwcmVmW2pdID49IHByZWZbaV0gLSBNKSB7CgkJLy8gCQltaW5pbWl6ZShmW2ldLCBmW2pdICsgMSk7IAoJCS8vIAkJbWF4aW1pemUoZ1tpXSwgZ1tqXSArIDEpOyAKCQkvLyAJfQoJCS8vIH0KCQkvLyBnacOhIHRy4buLIG7DqW4gY+G7p2EgcHJlZltpXSAtIE0KCQlpbnQgdmFsX2kgPSBsb3dlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIHByZWZbaV0gLSBNKSAtIHZhbHMuYmVnaW4oKSArIDE7ICAgCgkJbWluaW1pemUoZltpXSwgZ2V0MSh2YWxfaSkgKyAxKTsgICAKCQltYXhpbWl6ZShnW2ldLCBnZXQyKHZhbF9pKSArIDEpOyAKCgkJLy8gZ2nDoSB0cuG7iyBuw6luIGPhu6dhIHByZWZbaV0KCQl2YWxfaSA9IGxvd2VyX2JvdW5kKHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSwgcHJlZltpXSkgLSB2YWxzLmJlZ2luKCkgKyAxOyAgIAoJCXVwZGF0ZTEodmFsX2ksIGZbaV0pOyAKCQl1cGRhdGUyKHZhbF9pLCBnW2ldKTsgCgl9CgoJcmV0dXJuIChmW25dIDw9IGsgJiYgayA8PSBnW25dKTsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7ICAJCgljaW4gPj4gbiA+PiBrOyAgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjaW4gPj4gYVtpXSwgcHJlZltpXSA9IHByZWZbaSAtIDFdICsgYVtpXTsgCgoJaW50IGwgPSAtMWU5LCByID0gMWU5LCBhbnMgPSAtMTsgIAoJd2hpbGUgKGwgPD0gcikgewoJCWludCBtaWQgPSAobCArIHIpID4+IDE7ICAKCgkJaWYgKGNoZWNrKG1pZCkpIHsKCQkJYW5zID0gbWlkOyAgCgkJCXIgPSBtaWQgLSAxOyAKCQl9CgkJZWxzZSB7CgkJCWwgPSBtaWQgKyAxOyAKCQl9Cgl9CgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0K