Cod sursa(job #1124727)

Utilizator gabrielvGabriel Vanca gabrielv Data 26 februarie 2014 13:31:05
Problema Deque Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>

using namespace std;

#define NMAX 5000010

int N,K;
long long Sol;

struct Knoten {

    int Wert;
    Knoten *Links, *Recht;

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

Knoten *Deque;
Knoten *Position[NMAX];

void Addieren(int x, int pos)
{
    if(x < Deque->Wert)
    {
        Position[pos] = new Knoten(x, NULL, Deque);
        Deque->Links = Position[pos];
        Deque = Position[pos];
        return;
    }

    Knoten *p = Deque, *p2;

    while(p)
    {
        p2 = p->Recht;

        if(!p2)
            break;

        if(p2->Wert >= x)
            break;

        p = p2;
    }

    Position[pos] = new Knoten(x, p, p->Recht);
    if(p->Recht)
        p->Recht->Links = Position[pos];
    p->Recht = Position[pos];
}

void Entfernen(int pos)
{
    if(Deque == Position[pos])
        Deque = Deque->Recht;
    else
    {
        Position[pos]->Links->Recht = Position[pos]->Recht;
        if(Position[pos]->Recht)
            Position[pos]->Recht->Links = Position[pos]->Links;
    }

    delete Position[pos];
}

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

    int x;

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

    Deque = new Knoten(x,NULL,NULL);
    Position[1] = Deque;

    for(int i=2;i<=K;i++)
    {
        scanf("%d",&x);
        Addieren(x,i);
    }

    Sol += Deque->Wert;

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

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

    return 0;
}