Pagini recente » Cod sursa (job #1885085) | Cod sursa (job #2582652) | Cod sursa (job #520117) | Cod sursa (job #2499987) | Cod sursa (job #1836226)
#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;
}