没处理一个元素,就要维护他旁边的差
const int N = 100010;
typedef pair<LL, int> PLI;
priority_queue<PLI, vector<PLI>, greater<PLI> > Q;
int n, m;
LL Dat[N];
int L[N], R[N];
bool Okay[N];
inline void Input() {
scanf("%d%d", &n, &m);
For(i, 1, n) scanf("%I64d", &Dat[i]);
}
inline void Solve() {
/* Init Begin */
Dat[n+1] = Dat[0] = MLL, Okay[0] = 1;
For(i, 1, n) Dat[i] = Dat[i+1]-Dat[i], L[i] = i-1, R[i] = i+1, Q.push(PLI(Dat[i], i));
LL Ans = 0;
/* Init End */
while(m--) {
int Top = 0;
while(Okay[Top]) Top = Q.top().sd, Q.pop();
int l = L[Top], r = R[Top];
Okay[l] = Okay[r] = 1;
Ans += Dat[Top];
R[L[l]] = L[R[r]] = Top, Dat[Top] = Dat[l]+Dat[r]-Dat[Top];
L[Top] = L[l], R[Top] = R[r];
Q.push(PLI(Dat[Top], Top));
}
cout << Ans << endl;
}
int main() {
#ifndef ONLINE_JUDGE
SETIO("1150");
#endif
Input();
Solve();
return 0;
}