Pagini recente » Cod sursa (job #2641794) | Cod sursa (job #575705) | Cod sursa (job #1382878) | Cod sursa (job #2207603) | Cod sursa (job #1058623)
#include<cstdio>
#define nmax 5000010
int n,k,st,dr;;
int a[nmax],D[nmax];
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]);
st=1; dr=0; // Initializare, dr < st => deque vid
for(i=1;i<=n;++i)
{ // Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
while(st<=dr && a[i]<=a[D[dr]]) dr--;
// adaugam pozitia elementului curent in deque
D[++dr]=i;
// Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if(D[st]==i-k) st++;
// adunam minimul, acesta aflandu-se in varful deque-ului
if(k<=i) Sum+=a[D[st]];
}
printf("%lld\n",Sum); return 0;
}