Cod sursa(job #486419)

Utilizator Cristi09Cristi Cristi09 Data 21 septembrie 2010 17:09:19
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#define NMAX 200001
int heap[NMAX],order[NMAX],n,cont=0;
void adauga(int x)
{
	heap[++cont] = order[cont] = x;
	int var = cont,aux;
	while(var/2 > 0 && heap[var/2] > heap[var])
	{
		aux = heap[var/2];
		heap[var/2] = heap[var];
		heap[var] = aux;
		var /= 2;
	}
}
void elimina(int x)
{
	x = order[x];
	int i = 1, aux;
	for(;i<=cont && heap[i] != x;++i);
	
	heap[i] = heap[cont];
		
	while(i/2 > 0 && heap[i/2] > heap[i])
	{
		aux = heap[i/2];
		heap[i/2] = heap[i];
		heap[i] = aux;
		i /= 2;
	}
	while(i<=cont/2)
	{
		if(i*2+1 <= cont &&  heap[i*2+1] < heap[i*2] && heap[i*2+1] < heap[i])
		{
			aux = heap[i];
			heap[i] = heap[i*2+1];
			heap[i*2+1] = aux;
			i = i*2+1;
		}
		else if(heap[i*2] < heap[i])
		{
			aux = heap[i];
			heap[i] = heap[i*2];
			heap[i*2] = aux;
			i = i*2;
		}
		else i = cont+1;
	}
	heap[cont--] = 0;
}
int main()
{
	FILE*g = fopen("heapuri.out","w"); 
	FILE*f = fopen("heapuri.in","r");
	fscanf(f,"%d",&n);
	int i=1,tip,x;
	
	for(;i<=n;++i)
	{
		fscanf(f,"%d",&tip);
		if(tip == 1)
		{
			fscanf(f,"%d",&x);
			adauga(x);
		}
		if(tip == 2)
		{
			fscanf(f,"%d",&x);
			elimina(x);
		}
		if(tip == 3)
		fprintf(g,"%d\n",heap[1]);
	}
	fclose(f);
	fclose(g);
	return 0;
}