#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#define INF 1e9
using namespace std; 
typedef long long ll;
const ll MAXN = 100005;
pair<ll, ll>f(ll mid, vector<ll>& v, ll n) {
	vector<vector<pair<ll, ll>>>dp(n, vector<pair<ll, ll>>(2));
	dp[0][0] = { 0, 0 };
	dp[0][1] = { v[0] - mid, 1 };
	for (int i = 1; i < n; i++) {
		dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
		pair<ll, ll>x = { dp[i - 1][0].first + v[i] - mid, dp[i - 1][0].second + 1 };
		pair<ll, ll>y = { dp[i - 1][1].first + v[i], dp[i - 1][1].second};
		dp[i][1] = max(x, y);
	}
	return max(dp[n - 1][0], dp[n - 1][1]);
}
void solve()
{
	int n, k; cin >> n >> k;
	vector<ll>v(n);
	for (int i = 0; i < n; i++)cin >> v[i];
	ll lo = 0; ll hi = 1e15;
	while (lo < hi) {
		ll mid = (lo + hi + 1) / 2;
		if (f(mid, v, n).second >= k)lo = mid;
		else hi = mid - 1;
	}
	pair<ll, ll>ans = f(lo, v, n);
	cout << ans.first + lo * k << "\n";
}
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int t = 1;// cin >> t;
	while (t--) solve();
	return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |