#include <stdio.h>
#define MAX_N 5000000
#define MAX_VAL 10000000
#define INVALID -(MAX_VAL + 1)
struct deque {
int v[MAX_N];
int first, size;
int push_front(int val) {
if (size == MAX_N) // deque e plin
return 0; // returnam eroare
if (size == 0) // nu avem elemente
first = 0; // primul va fi adaugat pe pozitia zero
else {
--first; // tragem first mai in stanga
if (first == -1)
first = MAX_N - 1;
}
v[first] = val;
++size;
return 1;
}
int push_back(int val) {
if (size == MAX_N) // deque e plin
return 0; // returnam eroare
v[(first + size) % MAX_N] = val;
++size;
return 1;
}
int pop_front() {
if (size == 0)
return 0;
++first;
if (first == MAX_N)
first = 0;
--size;
return 1;
}
int pop_back() {
if (size == 0)
return 0;
--size;
return 1;
}
int front() {
return size > 0 ? v[first] : INVALID;
}
int back() {
return size > 0 ? v[(first + size - 1) % MAX_N] : INVALID;
}
};
deque myDeque;
int v[MAX_N];
int main() {
FILE* fin = fopen("deque.in", "r");
FILE* fout = fopen("deque.out", "w");
int n, k, i;
long long sum;
fscanf(fin, "%d%d", &n, &k);
for (i = 0; i < k - 1; ++i) {
fscanf(fin, "%d", &v[i]);
while (myDeque.size > 0 && v[i] <= v[myDeque.back()])
myDeque.pop_back();
myDeque.push_back(i);
}
sum = 0;
for (i = k - 1; i < n; ++i) {
fscanf(fin, "%d", &v[i]);
if (i - myDeque.front() == k)
myDeque.pop_front();
while (myDeque.size > 0 && v[i] <= v[myDeque.back()])
myDeque.pop_back();
myDeque.push_back(i);
sum += v[myDeque.front()];
}
fprintf(fout, "%lld\n", sum);
fclose(fin);
fclose(fout);
return 0;
}