Cod sursa(job #1049692)

Utilizator albupetruFMI Albu Petru albupetru Data 7 decembrie 2013 18:26:19
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
using namespace std;

struct nod{
int inf,exp;
nod *legs,*legd;}*d,*s;

int i,n,x,mn,val,xp,k;
long long int suma;

void pop_left(nod* &s)
{
    if(s==NULL) return;
    nod *p=s;
    if(s->legd)
    {s=s->legd; s->legs=NULL;}
    else s=NULL;

    delete p;
}

void pop_right(nod* &d)
{
    if(d==NULL) return;
    nod *p=d;
    if(d->legs)
    {d=d->legs; d->legd=NULL;}
    else d=NULL;

    delete p;
}

void add_right(int x, nod* &d)
{
    if(d==NULL){d=new nod; d->legs=d->legd=NULL; d->inf=x; s=d; return;}
    nod* p=new nod;
    p->inf=x;
    p->legs=d;
    d->legd=p;
    p->legd=NULL;
    d=p;
}

int main()
{
    ifstream f("deque.in");
    ofstream g("deque.out");
    f>>n>>k;
    s=new nod;
    //s->legs=s->legd=NULL;
    //d=s;
    d=s=NULL;
    for(i=1;i<=k;i++)
    {
        f>>val;
        while(d!=NULL && d->inf>val)
            pop_right(d);
        add_right(val,d);
        d->exp=i;
    }
    suma=s->inf;
    for(i=k+1;i<=n;i++)
    {
        if(s->exp+k==i)
            pop_left(s);
        f>>val;
        while(d!=NULL && d->inf>val)
            pop_right(d);
        add_right(val,d);
        d->exp=i;
        suma+=s->inf;
    }

    g<<suma;
    f.close();
    g.close();
    return 0;
}