Pagini recente » Cod sursa (job #3133790) | Cod sursa (job #3190262) | Cod sursa (job #709945) | Cod sursa (job #744095) | Cod sursa (job #540969)
Cod sursa(job #540969)
#include <stdio.h>
#define maxn 5000010
int N, K;
int A[maxn], Deque[maxn];
int Front, Back;
long long Sum;
int main()
{
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
int i;
scanf("%d %d ", &N, &K);
for (i = 1; i <= N; i++) scanf("%d ", &A[i]);
Front = 1, Back = 0; // prima data deque-ul este vid
for (i = 1; i <= N; i++)
{
// Cat timp elem curent este mai mic decat ult elem din deque, eliminam pozitia ult elem din deque
while (Front <= Back && A[i] <= A[ Deque[Back] ]) Back--;
//retinem pozitia
Deque[++Back] = i;
// Daca elem min coincide cu cel de pe poz i-K, ii eliminam poz din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (Deque[Front] == i-K) Front++;
// Afisam minimul, acesta aflandu-se in varful deque-ului
if (i >= K) Sum += A[ Deque[Front]];
}
printf("%lld\n", Sum);
return 0;
}