/**
* author minhnguyent546
* created_at Sat, 2025-11-08 07:32:27
**/
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "cp/debug.h"
#else
#define debug(...)
#define cerr if (false) cerr
#endif
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#define yay exit(EXIT_SUCCESS)
#define panik exit(EXIT_FAILURE)
const int INF = 0x3f3f3f3f;
const long long INF_LL = 0x3f3f3f3f3f3f3f3f;
#define bit(mask, i) (((mask) >> (i)) & 1)
int n, k;
vector<int> arr;
void read() {
cin >> n >> k;
if (n < 1 || n > (int) 2e5) {
eprintf("Expected n is in range [1, 2e5], found %d\n", n);
panik;
}
if (k < 1 || k * 2 > (n + 1)) {
eprintf("Expected k is in range [1, (n+1)/2], found %d\n", k);
panik;
}
arr.resize(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
if (arr[i] < -(int) 1e9 || arr[i] > (int) 1e9) {
eprintf("Expected arr[%d] is in range [-1e9, 1e9], found %d\n", i, arr[i]);
panik;
}
}
}
namespace sub1 {
bool check() {
return n <= 20;
}
void solve() {
cerr << " *** [sub1] *** " << '\n';
long long ans = -INF_LL;
for (int mask = 0; mask < (1 << n); ++mask) {
if (__builtin_popcount(mask) != k) continue;
bool valid = true;
for (int i = 0; i < n - 1; ++i) {
if (bit(mask, i) && bit(mask, i + 1)) {
valid = false;
break;
}
}
if (!valid) continue;
long long cur = 0;
for (int i = 0; i < n; ++i) {
if (bit(mask, i)) cur += arr[i];
}
ans = max(ans, cur);
}
cout << ans << '\n';
}
} // namespace sub1
namespace sub2 {
bool check() {
return k == 2;
}
void solve() {
cerr << " *** [sub2] *** " << '\n';
int ans = INT_MIN;
int max_prev = -INF;
for (int i = 1; i < n; ++i) {
ans = max(ans, arr[i] + max_prev);
max_prev = max(max_prev, arr[i - 1]);
}
cout << ans << '\n';
}
} // namespace sub2
namespace sub3 {
bool check() {
return k == 3;
}
void solve() {
cerr << " *** [sub3] *** " << '\n';
vector<int> max_left(n), max_right(n);
max_left[0] = arr[0];
for (int i = 1; i < n; ++i) {
max_left[i] = max(max_left[i - 1], arr[i]);
}
max_right[n - 1] = arr[n - 1];
for (int i = n - 2; i >= 0; --i) {
max_right[i] = max(max_right[i + 1], arr[i]);
}
long long ans = -INF_LL;
for (int i = 2; i < n - 2; ++i) {
ans = max(ans, (long long) arr[i] + max_left[i - 2] + max_right[i + 2]);
}
cout << ans << '\n';
}
} // namespace sub3
namespace sub4 {
bool check() {
return n <= (int) 1e3;
}
void solve() {
cerr << " *** [sub4] *** " << '\n';
vector<vector<long long>> dp(k + 1, vector<long long>(n + 1, -INF_LL));
vector<long long> max_sofar(n + 1);
for (int i = 1; i <= n; ++i) {
dp[1][i] = max(dp[1][i - 1], (long long) arr[i - 1]);
}
for (int j = 2; j <= k; ++j) {
max_sofar[0] = dp[j - 1][0];
for (int i = 1; i <= n; ++i) {
max_sofar[i] = max(max_sofar[i - 1], dp[j - 1][i]);
}
for (int i = 1; i <= n; ++i) {
// ignore a_i
dp[j][i] = dp[j][i - 1];
// add a_i
// for (int z = 0; z <= i - 2; ++z) {
// dp[j][i] = max(dp[j][i], dp[j - 1][z] + arr[i - 1]);
// }
if (i - 2 >= 0) dp[j][i] = max(dp[j][i], max_sofar[i - 2] + arr[i - 1]);
}
}
cout << dp[k][n] << '\n';
}
} // namespace sub4
namespace sub5 {
bool check() {
return k == n / 2 && (n % 2 == 0);
}
void solve() {
cerr << " *** [sub5] *** " << '\n';
int sz = n / 2;
vector<array<long long, 2>> dp(sz, {-INF_LL, -INF_LL});
dp[0][0] = arr[0];
dp[0][1] = arr[1];
for (int i = 1; i < sz; ++i) {
dp[i][0] = dp[i - 1][0] + arr[i * 2];
dp[i][1] = max(dp[i - 1][0], dp[i - 1][1]) + arr[i * 2 + 1];
}
cout << max(dp[sz - 1][0], dp[sz - 1][1]) << '\n';
}
} // namespace sub5
namespace sub6 {
bool check() {
return k == (n + 1) / 2 && (n & 1);
}
void solve() {
cerr << " *** [sub6] *** " << '\n';
if (n == 1) {
cout << arr[0] << '\n';
return;
}
int sz = n / 2;
vector<array<long long, 2>> dp(sz, {-INF_LL, -INF_LL});
vector<array<long long, 2>> rdp(sz, {-INF_LL, -INF_LL});
vector<int> rarr(arr.begin(), arr.end());
rarr.pop_back();
reverse(rarr.begin(), rarr.end());
dp[0][0] = arr[0];
dp[0][1] = arr[1];
rdp[0][1] = rarr[1];
for (int i = 1; i < sz; ++i) {
dp[i][0] = dp[i - 1][0] + arr[i * 2];
rdp[i][0] = rdp[i - 1][0] + rarr[i * 2];
dp[i][1] = max(dp[i - 1][0], dp[i - 1][1]) + arr[i * 2 + 1];
debug(n, sz, i * 2 + 1);
assert(i * 2 + 1 < n - 1);
rdp[i][1] = max(rdp[i - 1][0], rdp[i - 1][1]) + rarr[i * 2 + 1];
}
// ignore arr[n - 1]
long long ans = max(dp[sz - 1][0], dp[sz - 1][1]);
// add arr[n - 1], must remove one pair
if (sz == 1) {
ans = max(ans, 1LL * arr[n - 1]);
} else {
for (int i = 0; i < sz; ++i) {
if (i == 0) {
ans = max(ans, max(rdp[sz - 2][0], rdp[sz - 2][1]) + arr[n - 1]);
} else if (i == sz - 1) {
ans = max(ans, max(dp[sz - 2][0], dp[sz - 2][1]) + arr[n - 1]);
} else {
ans = max(ans, (max(dp[i - 1][0], dp[i - 1][1]) + max(rdp[sz - i - 2][0], rdp[sz - i - 2][1])) + arr[n - 1]);
}
}
}
cout << ans << '\n';
}
} // namespace sub6
namespace sub7 {
bool check() {
return true;
}
void solve() {
cerr << " *** [sub7] *** " << '\n';
vector<long long> dp(n + 1, INF);
vector<int> min_cnt(n + 1, 0);
auto gud = [&](int lambda) {
dp[0] = 0;
min_cnt[0] = 0;
if (arr[0] - lambda >= 0) {
dp[1] = arr[0] - lambda;
min_cnt[1] = 1;
} else {
dp[1] = 0;
min_cnt[1] = 0;
}
for (int i = 2; i <= n; ++i) {
// ignore a_i
dp[i] = dp[i - 1];
min_cnt[i] = min_cnt[i - 1];
// add a_i
long long nval = dp[i - 2] + arr[i - 1] - lambda;
if (nval > dp[i]) {
dp[i] = nval;
min_cnt[i] = min_cnt[i - 2] + 1;
} else if (nval == dp[i]) {
min_cnt[i] = max(min_cnt[i], min_cnt[i - 2] + 1);
}
}
// return min_cnt[n] >= k;
return min_cnt[n] >= k;
};
int inf = (int) 1e9;
int l = -inf - 3, r = inf + 3;
while (l < r) {
int mid = l + (r - l + 1) / 2;
if (gud(mid)) {
l = mid;
} else {
r = mid - 1;
}
}
gud(l);
cout << dp[n] + 1LL * k * l << '\n';
}
} // namespace sub7
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin.exceptions(cin.failbit);
read();
sub7::solve(); yay;
#ifdef LOCAL
sub5::solve(); yay;
sub6::solve(); yay;
sub7::solve(); yay;
sub4::solve(); yay;
sub3::solve(); yay;
sub2::solve(); yay;
sub1::solve(); yay;
#endif
if (sub1::check()) {
sub1::solve(); yay;
}
if (sub2::check()) {
sub2::solve(); yay;
}
if (sub3::check()) {
sub3::solve(); yay;
}
if (sub4::check()) {
sub4::solve(); yay;
}
if (sub5::check()) {
sub5::solve(); yay;
}
if (sub6::check()) {
sub6::solve(); yay;
}
if (sub7::check()) {
sub7::solve(); yay;
}
return 0;
}