Cod sursa(job #1125105)

Utilizator gabrielvGabriel Vanca gabrielv Data 26 februarie 2014 15:42:26
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>

using namespace std;

#define NMAX 5000010

int N,K;
long long Sol;

struct Knoten {

    int Wert,Pos;
    Knoten *Links, *Recht;

    Knoten(int a, Knoten *b, Knoten *c, int d)
    {
        Wert = a;
        Links = b;
        Recht = c;
        Pos = d;
    }
};

Knoten *Deque,*DequeEnd;

void Addieren(int x, int pos)
{
    if(DequeEnd)
        while(DequeEnd && DequeEnd->Wert > x)
            if(DequeEnd->Links)
            {
                DequeEnd = DequeEnd->Links;
                delete DequeEnd->Recht;
            }
            else
            {
                delete DequeEnd;
                DequeEnd = Deque = NULL;
            }

    if(!Deque)
        Deque = DequeEnd = new Knoten(x,NULL,NULL,pos);
    else
    {
        DequeEnd->Recht = new Knoten(x,DequeEnd,NULL,pos);
        DequeEnd = DequeEnd->Recht;
    }
}

void Entfernen(int minPos)
{
    while(Deque && Deque->Recht && Deque->Pos <= minPos)
    {
        Deque = Deque->Recht;
        delete Deque->Links;
        Deque->Links = NULL;
    }

    if(Deque && Deque->Pos <= minPos)
    {
        delete Deque;
        Deque = DequeEnd = NULL;
    }
}

int main()
{
    freopen("deque.in","r",stdin);
    freopen("deque.out","w",stdout);

    scanf("%d%d",&N,&K);

    for(int i=1,x;i<=N;i++)
    {
        Entfernen(i-K);
        scanf("%d",&x);
        Addieren(x,i);
        if(i>=K)
            Sol += Deque->Wert;
    }

    printf("%lld\n",Sol);

    return 0;
}