Pagini recente » Cod sursa (job #3142984) | Cod sursa (job #114962) | Cod sursa (job #1512329) | Cod sursa (job #53739) | Cod sursa (job #1046732)
#include<stdio.h>
FILE*f=fopen("deque.in","r");
FILE*g=fopen("deque.out","w");
int n,k,x,nr;
struct heap
{
int v,p;
} h[5000001];
void up(int k)
{
h[0]=h[k];
while(k>1&&h[0].v<h[k>>1].v)
{
h[k]=h[k>>1];
k>>=1;
}
h[k]=h[0];
}
void down(int k)
{
h[0]=h[k];
int fiu;
while(k<<1<=nr)
{
fiu=0;
k<<=1;
if(h[k].v<h[0].v)
fiu=k;
if(k+1<=nr&&h[k].v>h[k+1].v)
fiu=k+1;
if(fiu&&h[fiu].v<h[0].v)
{
int fiu2=k>>1;
h[fiu2]=h[fiu];
k=fiu;
}else
{
k>>=1;
break;
}
}
h[k]=h[0];
}
int main()
{
fscanf(f,"%d%d",&n,&k);
for(int i=1;i<=k;++i)
{
fscanf(f,"%d",&x);
h[++nr].v=x;
h[nr].p=i;
up(nr);
}
long long sol=0;
for(int i=k+1;i<=n;++i)
{
while(h[1].p<i-k)
{
h[1]=h[nr--];
down(1);
}
sol+=h[1].v;
fscanf(f,"%d",&x);
h[++nr].v=x;
h[nr].p=i;
up(nr);
}
while(h[1].p<=n-k)
{
h[1]=h[nr--];
down(1);
}
sol+=h[1].v;
fprintf(g,"%lld",sol);
fclose(f);
fclose(g);
return 0;
}