#include <bits/stdc++.h>
using namespace std;
constexpr int MAXT = (1 << 20);
constexpr int MAXN = 5e5 + 5;
vector <int> tree[MAXT];
int a[MAXN];
vector <int> merge(vector <int> &a, vector <int> &b){
    vector <int> c;
    int i = 0;
    int j = 0;
    while (i < (int)a.size() && j < (int)b.size()){
        if (a[i] < b[j]){
            c.push_back(a[i++]);
        }
        else{
            c.push_back(b[j++]);
        }
    }
    while (i < (int)a.size()){
        c.push_back(a[i++]);
    }
    while (j < (int)b.size()){
        c.push_back(b[j++]);
    }
    return c;
}
void build(int v, int l, int r){
    if(l == r - 1){
        tree[v] = {a[l]};
        return;
    }
    int m = (l + r) / 2;
    build(2 * v + 1, l, m);
    build(2 * v + 2, m, r);
    tree[v] = merge(tree[2 * v + 1], tree[2 * v + 2]);
}
int get(int v, int l, int r, int ql, int qr, int x){
    if (ql >= r || l >= qr){
        return 0;
    }
    if (ql <= l && r <= qr){
        int i = upper_bound(tree[v].begin(), tree[v].end(), x) - tree[v].begin();
        return i;
    }
    int m = (l + r) / 2;
    return get(2 * v + 1, l, m, ql, qr, x) + get(2 * v + 2, m, r, ql, qr, x);
}
int n, k;
long long res = 0;
void func(int pos, vector <int> sp){
    if (pos == -1){
        long long nw = 0;
        for (auto v: sp){
            nw += v;
            if (v == 0){
                return;
            }
        }
        res = max(res, nw);
        return;
    }
    for (int i = 0; i < k; i++){
        vector <int> nw = sp;
        nw[i] = max(nw[i], a[pos]);
        nw[i]++;
        func(pos - 1, nw);
    }
}
signed main(){
    cin >> n >> k;
    for (int i = 0; i < n; i++){
        cin >> a[i];
    }
    if (n <= 8){
        vector <int> sp(k, 0);
        func(n - 1, sp);
        cout << res << '\n';
        return 0;
    }
    multiset <int> st;
    for (int i = 0; i < k; i++){
        st.insert(0);
    }
    build(0, 0, n);
    int cnt0 = k;
    for (int i = n - 1; i > -1; i--){
        if (i == n - 1){
            st.erase(st.find(0));
            st.insert(a[n - 1] + 1);
            cnt0--;
            continue;
        }
        int x = i - get(0, 0, n, 0, i, a[i]);
        if (cnt0 > x){
            st.erase(st.find(0));
            st.insert(a[i] + 1);
            cnt0--;
            continue;
        }
        auto v = *(st.lower_bound(1));
        st.erase(st.find(v));
        v = max(v, a[i]);
        v++;
        st.insert(v);
    }
    long long res = 0;
    for (auto v: st){
        res += v;
    }
    cout << res << '\n';
}
