Cod sursa(job #1125013)

Utilizator gabrielvGabriel Vanca gabrielv Data 26 februarie 2014 15:08:29
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 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)
{
    while(Deque && DequeEnd->Links && DequeEnd->Wert > x)
    {
        DequeEnd = DequeEnd->Links;
        delete DequeEnd->Recht;
        DequeEnd->Recht = NULL;
    }

    if(DequeEnd && DequeEnd->Wert > x)
    {
        delete DequeEnd;
        DequeEnd = Deque = NULL;
    }

    Knoten *p;

    if(!Deque)
        Deque = DequeEnd = new Knoten(x,NULL,NULL,pos);
    else
        if(x < Deque->Wert)
        {
            p = new Knoten(x, NULL, Deque, pos);
            Deque->Links = p;
            Deque = p;
        }
        else
        {
            p = Deque;
            Knoten *p2;

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

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

                p = p2;
            }

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

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

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

    int x;

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

    for(int i=1;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;
}