Cod sursa(job #1328228)

Utilizator andreismara97Smarandoiu Andrei andreismara97 Data 28 ianuarie 2015 09:31:30
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<fstream>
#include<deque>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");

#define Nmax 5000001

deque <int> q;   //Folosim coada sa retinem numerele in ordine crescatoare, unde deque va salva pozitiile acestora
int N, K, A[Nmax];  //A va retine toate elementele
long long sum=0;

void citire()
{
    in>>N>>K;
    for(int i=1;i<=N;i++)
        in>>A[i];
}

int main ()
{
    citire();

    for(int i=1; i<=N; i++)
    {
        while( !q.empty() && A[i] <= A[ q.back()] )  //Cream coada, salvand pozitia i a.i. A[i] > A[ ultima pozitie din coada ]
            q.pop_back();
        q.push_back(i); // Stergand toate numerele mai mari din coada, tto ce ne ramane e sa adaugam pozitia i

        if( q.front() == i-K)   //Daca prima pozitie == i-K, inseamna ca prima pozitie din coada a fost calculata pentru toate subsecventele
            q.pop_front();         //din care ea face parte in sir

        if( i>=K )
            sum+= A[q.front()];
    }

    out<<sum<<'\n';
    return 0;
}