#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef string ss;
template<class T> using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define Omar_G ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define all(x) x.begin(), x.end()
#define endl "\n"
random_device rd;
mt19937 mt(rd());
int rnd(int l, int r) {
return uniform_int_distribution<int>(l, r)(mt);
}
#define Y(x) ss((x) ? "Yes" : "No")
const ll mod = 676767677, inf = 5e18, N = 2e5 + 5, M = 500+5;
vector<ss> a, v;
ll n, m, si, sj, r[4] = {-1, 1, 0, 0}, c[4] = {0, 0, -1, 1}, gi, gj;
ss dir = "UDLR";
void dfs(ll i, ll j, char l) {
if (i == n || j == m || i < 0 || j < 0) return;
if (a[i][j] == '#' || v[i][j] != '0') return;
v[i][j] = l;
if (a[i][j] == 'G') return;
for (ll i = 0; i < 4; i++) {
if (a[i][j] == 'o' && dir[i] == l) dfs(i + r[i], j + c[i], dir[i]);
else if (a[i][j] == 'x' && dir[i] != l) dfs(i + r[i], j + c[i], dir[i]);
else if (a[i][j] == '.' || a[i][j] == 'S') dfs(i + r[i], j + c[i], dir[i]);
}
}
void solve() {
ll n, k;
cin >> n >> k;
ll a[n], b[n-1]{}, ans = n;
for (ll &i : a) cin >> i;
for (ll i = 0; i + 1 < n; i++) {
b[i] = a[i+1] - a[i];
}
sort(b, b + n-1);
for (ll i = 0; i < n - k; i++) {
ans += b[i] - 1;
}
cout << ans << endl;
}
int main() {
Omar_G
// freopen("a.in", "r", stdin);
// freopen("a.out", "w", stdout);
ll t = 1;
//cin >> t;
for (ll i = 1; i <= t; i++) {
solve();
}
return 0;
}