Cod sursa(job #1124947)

Utilizator gabrielvGabriel Vanca gabrielv Data 26 februarie 2014 14:42:13
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 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;
Knoten *Position[NMAX];

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

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

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

            p = p2;
        }

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

    while(DequeEnd->Wert > x)
    {
        Position[DequeEnd->Pos] = NULL;
        DequeEnd = DequeEnd->Links;
        delete DequeEnd->Recht;
        DequeEnd->Recht = NULL;
    }
}

void Entfernen(int pos)
{
    if(!Position[pos])
        return;

    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];
    Position[pos] = NULL;
}

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

    int x;

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

    Deque = DequeEnd = new Knoten(x,NULL,NULL,1);
    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;
}