Cod sursa(job #824856)

Utilizator mariacMaria Constantin mariac Data 27 noiembrie 2012 01:44:59
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>

using namespace std;

ifstream fin("deque.in");
ofstream fout("deque.out");
struct h{int inf;
			int poz;
};
h heap[5000000];
int j=0,aux,k,s;
void add(int i)
{	
	int x;
	fin>>x;
	
	heap[++j].inf=x;
	heap[j].poz=i;
	int j2;
	j2=j;
	while(j>1&&heap[j/2].inf>heap[j].inf)
		{
			aux=heap[j/2].inf;
			heap[j/2].inf=heap[j].inf;
			heap[j].inf=aux;
			aux=heap[j/2].poz;
			heap[j/2].poz=heap[j].poz;
			heap[j].poz=aux;
			j=j/2;
		}
	j=j2;
}

void remove()
{ 	int u,p;
	heap[1].inf=heap[j].inf;
	heap[1].poz=heap[j].poz;
	heap[j].inf=0;
	j--;
	u=1;
	while(2*u<=j&&(heap[2*u].inf<heap[u].inf||((2*u+1<=j)&&heap[2*u+1].inf<heap[u].inf) ) )
		{
			if(2*u+1<=j&&heap[2*u+1].inf<heap[2*u].inf)p=2*u+1;
				else p=2*u;
			aux=heap[p].inf;
			heap[p].inf=heap[u].inf;
			heap[u].inf=aux;
			aux=heap[p].poz;
			heap[p].poz=heap[u].poz;
			heap[u].poz=aux;
			u=p;
		}
}
			
	
void afisare(int i)
{
	while(heap[1].poz<i-k+1)remove();
	
	s+=heap[1].inf;
}


int main()
{
	int n,i;
	fin>>n;
	fin>>k;
	for(i=1;i<=n;i++)
		{add(i);
	     if(i>=k)afisare(i);
		}
	fout<<s;
	return 0;
}