Cod sursa(job #1836226)

Utilizator dranoellenTurica Leonard-Petru dranoellen Data 27 decembrie 2016 23:28:55
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <cstdio>

using namespace std;

struct point
{
    point *next=NULL,*prev=NULL;
    int index,value;
};


int main()
{
    point *first,*minimum,*last;
    FILE *in=fopen("deque.in","r")
    ,*out=fopen("deque.out","w");
    int n,d,index=0,x;
    long long s=0;
    fscanf(in,"%d%d",&n,&d);
    first=new point;
    fscanf(in,"%d",&first->value);
    first->index=++index;
    minimum=first;
    last=first;
    ++index;
    for(; index<=n; ++index)
    {
        fscanf(in,"%d",&x);
        if(first->next==NULL)
        {
            if(first->index==index-d)
                first->index=index,
                       first->value=x;
            else if(first->value>=x)
                first->value=x,
                       first->index=index;
            else
            {
                point *nr=new point;
                last->next=nr;
                nr->prev=last;
                last=nr;
                last->index=index;
                last->value=x;
            }
        }
        else
        {
            if(first->index==index-d)
            {
                if(minimum==first)
                {
                    minimum=first->next;
                    for(point *nr=minimum->next; nr; nr=nr->next)
                        if(minimum->value>=nr->value)minimum=nr;
                }
                first=first->next;
                delete first->prev;
                first->prev=0;
            }
            if(last->value>=x)
                    last->value=x,
                          last->index=index;
                else
                {
                    point *nr=new point;
                    last->next=nr;
                    nr->prev=last;
                    last=nr;
                    last->index=index;
                    last->value=x;
                }
            if(x<=minimum->value)minimum=last;
        }

    if(index>=d)s=(long long)s+minimum->value;

    }
    fprintf(out,"%lld",s);

    return 0;
}