Pagini recente » Cod sursa (job #2490383) | Cod sursa (job #2447012) | Cod sursa (job #3285735) | Cod sursa (job #1876962) | Cod sursa (job #1046710)
#include<stdio.h>
FILE*f=fopen("deque.in","r");
FILE*g=fopen("deque.out","w");
int n,k,x,nr,poz[5000001];
struct heap
{
int v,p;
} h[5000001];
void up(int k)
{
h[0]=h[k];
while(k>1&&h[0].v<h[k/2].v)
{
h[k]=h[k/2];
poz[h[k].p]=k;
k/=2;
}
h[k]=h[0];
poz[h[k].p]=k;
}
void down(int k)
{
h[0]=h[k];
int fiu;
while(2*k<=nr)
{
fiu=0;
k*=2;
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)
{
h[fiu/2]=h[fiu];
poz[h[fiu/2].p]=fiu/2;
k=fiu;
}else
{
k/=2;
break;
}
}
h[k]=h[0];
poz[h[k].p]=k;
}
void scoate(int k)
{
h[k]=h[nr--];
poz[h[k].p]=k;
if(k>1&&h[k].v<h[k/2].v)
up(k);
else
down(k);
}
int main()
{
fscanf(f,"%d%d",&n,&k);
for(int i=1;i<=k;++i)
{
fscanf(f,"%d",&x);
h[++nr].v=x;
poz[i]=nr;
h[nr].p=i;
up(nr);
}
long long sol=0;
for(int i=k+1;i<=n;++i)
{
sol+=h[1].v;
scoate(poz[i-k]);
fscanf(f,"%d",&x);
h[++nr].v=x;
h[nr].p=i;
poz[i]=nr;
up(nr);
}
sol+=h[1].v;
fprintf(g,"%lld",sol);
fclose(f);
fclose(g);
return 0;
}