#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <random>
#include <queue>
#include <numeric>
#include <array>
#include <iomanip>
#include <stack>
#include <chrono>
#include <climits>
#include <bitset>
using namespace std;
using ll = long long;
using ld = long double;
using vd = vector<ld>;
using vi = vector<ll>;
using vii = vector<vi>;
using viii = vector<vii>;
using pi = pair<ll, ll>;
using vpi = vector<pi>;
using vb = vector<bool>;
using vs = vector<string>;
#define vec vector
#define cmax(x, ...) x = max({x, __VA_ARGS__})
#define cmin(x, ...) x = min({x, __VA_ARGS__})
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
const ll N = 1e5 + 5, MOD = 998244353, INF = 1e18, K = 20;
ll B;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
void solve() {
ll n, k; cin >> n >> k;
vi a(n + 1); for (ll i = 1; i <= n; i++) cin >> a[i];
ll ans = 0;
auto get = [&](ll m) -> pi {
pi dp[2]; dp[0] = { 0, 0 }; dp[1] = { a[1] - m, 1 };
for (ll i = 2; i <= n; i++) {
pi nw[2];
nw[0] = max(dp[0], dp[1]);
nw[1] = max(make_pair(dp[1].first + a[i], dp[1].second),
make_pair(dp[0].first + a[i] - m, dp[0].second + 1));
swap(nw, dp);
}
return max(dp[0], dp[1]);
};
ll l = 0, r = 1e18;
while (l <= r) {
ll m = l + (r - l) / 2;
if (get(m).second >= k) {
l = m + 1;
}
else {
r = m - 1;
}
}
cout << get(r).first + k * r;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
long long tt = 1, _ = 1;
//cin >> tt >> _;
while (tt--) {
solve();
cout << '\n';
}
return 0;
}
/*
3 3
1 10 2
5 6 1
4 1 5
2 3 2
7 5 15
1 9 12
Темы выучить(повторить):
1) квт
2) вайвлет три
3) 2сат
4)
*/