Pagini recente » Cod sursa (job #1755658) | Cod sursa (job #178530) | Cod sursa (job #1448484) | Cod sursa (job #136836) | Cod sursa (job #541199)
Cod sursa(job #541199)
#include <stdio.h>
#define maxn 5000010
int n, k, i;
int A[maxn], D[maxn];
int st, dr;
long long Sum;
int main()
{ freopen("deque.in", "r", stdin); freopen("deque.out", "w", stdout);
scanf("%d %d ", &n, &k);
for (i = 1; i <= n; i++) scanf("%d ", &A[i]); // Citesc sirul dat
st = 1, dr = 0; // Initializare, dr < st => D-ul este vid
for (i = 1; i <= n; i++)
{ // Cat timp elementul curent este mai mic decat ultimul element din D, eliminam pozitia ultimului element din D
while (st <= dr && A[i] <= A[ D[dr] ]) dr--;
// Adaugam pozitia elementului curent in D
D[++dr] = i;
// Daca elementul minim coincide cu cel de pe pozita i-k, ii eliminam pozitia din D, deoarece acesta nu mai conteaza pentru pasii >= i
if (D[st] == i-k) st++;
// Afisam minimul, acesta aflandu-se in varful D-ului
if (i >= k) Sum += A[ D[st]];
}
printf("%lld\n", Sum);
return 0;
}