Cod sursa(job #563441)

Utilizator SadmannCornigeanu Calin Sadmann Data 25 martie 2011 09:33:42
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
#include<deque>
#define NMAX 5000005
using namespace std;
long int N,K,x,suma;
long int V[NMAX];
FILE *in,*out;
deque<int> deck;
int main()
{
    in=fopen("deque.in","rt");
    out=fopen("deque.out","wt");
    fscanf(in,"%ld %ld",&N,&K);
    fscanf(in,"%d",&V[1]);
    deck.push_back(1);
    for(int i=2;i<=N;i++)
    {
        fscanf(in,"%d",&V[i]);
        // Cat timp elementul curent este mai mic decat ultimul element
        // din deque, eliminam pozitia ultimului element din deque
        while(!deck.empty() && V[i]<=V[deck.back()])
            deck.pop_back();
        deck.push_back(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(deck.front()==i-K)
            deck.pop_front();
        if(i>=K)
            suma+=V[deck.front()];
    }
    fprintf(out,"%ld\n",suma);

    fclose(in);
    fclose(out);
    return 0;
}