Cod sursa(job #1046726)

Utilizator Robert29FMI Tilica Robert Robert29 Data 3 decembrie 2013 13:40:21
Problema Deque Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#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);
	}
	sol+=h[1].v;
	
	fprintf(g,"%lld",sol);
	
	fclose(f);
	fclose(g);
	return 0;
}