Cod sursa(job #1503263)

Utilizator daneel95Holteiu Daniel-Ninel daneel95 Data 15 octombrie 2015 20:06:34
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

using namespace std;

ifstream in("deque.in");
ofstream out("deque.out");

int n, k;
int a[5000001], deque[5000001];
int front, back;
long long int sum;

int main()
{
    int i;

    in>>n;
    in>>k;

    // Citesc sirul dat

    for (i = 1; i <= n; i++) in>>a[i];

    front = 1;
    back = 0; // Initializare, Back < Front => deque-ul este 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 (front <= back && a[i] <= a[ deque[back] ]) back--;
        // Adaugam pozitia elementului curent in deque
        back++;
        deque[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 (deque[front] == i-k) front++;

        // Afisam minimul, acesta aflandu-se in varful deque-ului
        if (i >= k) sum += a[ deque[front]];
    }

    out<<sum;

    in.close();
    out.close();

    return 0;
}