Cod sursa(job #1058623)

Utilizator enedumitruene dumitru enedumitru Data 15 decembrie 2013 18:29:26
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#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;
}