#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

// 这道题关键洞察在于跳关工具均位于k的倍数关卡, 而跳关工具具备时效性,只能对未来的关卡施加影响
// 因此我们不妨从后往前遍历,让元素加入优先队列(自动降序的队列),然后如果遇到了k的倍数关卡,
// 那么就意味着我们能将优先队列队头的元素(耗时最长且还未完成的关卡)取出,
// 同时不断将当前遍历的元素压入优先队列,以上这一次遍历就能求出总节省下来的时间

int main() {
    int n, k;
    cin >> n >> k;
    vector<long long> s1(n);
    long long total_time = 0;
    for (int i = 0; i < n; i++) {
        cin >> s1[i];
        total_time += s1[i];
    } // 一次遍历,读入元素,得到原始总消耗时间

    long long save_time = 0;
    priority_queue<long long> s2;
    for (int i = n-1; i >= 0; i--) {
        if ((i+1) % k == 0 && !s2.empty()) {
                save_time += s2.top();
                s2.pop();
        }
        s2.push(s1[i]);        
    } // 二次遍历,得到总节省时间

    cout << total_time - save_time;    
}