#include <fstream>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
//folosim un double ended queue in care memoram pozitiile
//o sa fie mereu in ordine crescatoare pentru ca eliminam de fiecare data cand gasim o poz mai mica
//O(n) pentru ca eliminarea si adaugarea in deque e O(1) amortizat
int A[5000005], D[5000005];
int N, K;
void Citire()
{
//citim N si K
fin >> N >> K;
//citim elem din sirul A
for (int i = 0; i <= N; i++)
fin >> A[i];
}
long long Rezultat()
{
int front, rear; //pentru parcurgere prin deque
long long S = 0; //long long pt ca suma maxima este 5*10^13
//initializam deque gol
front = 0;
rear = -1;
for (int i = 0; i < N; i++)
{
//la fiecare pas elementul curent A[i] elimina de la finalul lui D toate elementele mai mari sau egale cu el
//acesta fiind noul minim pentru subsecventele urm
while (front <= rear && A[i] <= A[D[rear]])
rear--;
//este adaugat la finalul lui D
D[++rear] = i;
//eliminam de la inceputul lui D daca minimul nu mai apartine subsecv
if (D[front] + K == i) front++;
//avem minim o subsecventa de K elem
if (i + 1 >= K)
S += A[D[front]];
}
return S;
}
int main()
{
Citire();
fout << Rezultat();
return 0;
}