Cod sursa(job #1046710)

Utilizator Robert29FMI Tilica Robert Robert29 Data 3 decembrie 2013 13:15:14
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#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;
}