#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
#define sz(a) int(a.size())
#define f(i, a, b) for (int i = a; i < b; i++)
#define rep(i, a) f(i, 0, a)
#define int ll
#define tv(a, x) for (auto& a : x)
#define DUZO 1000000000000000000LL
#define en "\n"
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vii = vector<pii>;
pii lep(pii a, pii b) {
if (a.st != b.st) {
if (a.st > b.st) return a;
else return b;
}
if (a.nd < b.nd) return a;
else return b;
}
void solve() {
int n, k;
cin >> n >> k;
vi a(n);
f(i, 0, n) cin >> a[i];
int l = -1'000'000'000'000;
int r = 0;
while (r > l) {
int mid = (l + r + 1)/2;
vii dp(2);
dp = {{0, 0}, {-DUZO, 0}}; //jaki wynik ile otwartych
//cout << en << "mid=" << mid << en;
f(i, 0, n) {
pii o = lep({dp[1].st + a[i], dp[1].nd}, {dp[0].st + mid + a[i], dp[0].nd + 1});
pii z = lep(dp[0], o);
dp[0] = z;
dp[1] = o;
//cout << "i=" << i << " " << dp[0].st << " " << dp[1].st << en;
}
pii p1 = lep(dp[0], dp[1]);
if (p1.nd > k) {
r = mid - 1;
} else {
l = mid;
}
}
//cout << "r=" << r << en;
int mid = r;
vii dp(2);
dp = {{0, 0}, {-DUZO, 0}}; //jaki wynik ile otwartych
f(i, 0, n) {
pii o = lep({dp[1].st + a[i], dp[1].nd}, {dp[0].st + mid + a[i], dp[0].nd + 1});
pii z = lep(dp[0], o);
dp[0] = z;
dp[1] = o;
}
pii p1 = lep(dp[0], dp[1]);
cout << p1.st - (r *k) << en;
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
int q = 1;
//cin >> q;
while (q--) {
solve();
}
return 0;
}