Cod sursa(job #395574)

Utilizator Astrid28Ruxandra Cohal Astrid28 Data 13 februarie 2010 14:45:47
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
#define Nmax 200000
#define El_max 100000000

long n, Heap[Nmax], PozH[El_max], Timp[Nmax], nr_el_heap, nr_timp;
FILE *fin, *fout;

void interschimba(long &x, long &y)
{
	long aux;
	aux=x;
	x=y;
	y=aux;
}

//inserez el. x in heap ("urcare")
void insereaza(long Heap[Nmax], long x)
{
	long i;
	Heap[++nr_el_heap]=x;
	PozH[x]=nr_el_heap;
	Timp[++nr_timp]=x;
	i=nr_el_heap;
	while (i>0)
	{
		if (i/2)
			if (Heap[i]<Heap[i/2])
			{
				interschimba(PozH[Heap[i]],PozH[Heap[i/2]]);
				interschimba(Heap[i],Heap[i/2]);
			}
		i=i/2;
	}
}

//sterg el. x din heap ("scufundare")
void sterge(long Heap[Nmax], long x)
{
	int ok=0;
	long i, min;
	i=PozH[x];
	PozH[x]=0;
	Heap[i]=Heap[nr_el_heap--];
	PozH[Heap[i]]=i;
	while (i<=nr_el_heap/2 && !ok)
	{
		ok=1;
		if (2*i<=nr_el_heap && Heap[i]>Heap[2*i])
			min=2*i;
		else min=i;
		if (2*i+1<=nr_el_heap && Heap[2*i+1]<Heap[min])
			min=2*i+1;
		if (min!=i)
		{
			interschimba(PozH[Heap[i]],PozH[Heap[min]]);
			interschimba(Heap[i],Heap[min]);
			i=min, ok=0;
		}
	}

}


int main()
{
	int op;
	long i, el;

	fin=fopen("heapuri.in","r");
	fout=fopen("heapuri.out","w");

	fscanf(fin,"%ld", &n);
	nr_el_heap=0;
	nr_timp=0;
	for (i=1; i<=n; i++)
	{
		fscanf(fin,"%d",&op);
		if (op==3)
			fprintf(fout,"%ld \n",Heap[1]);
		else
		{
			fscanf(fin,"%ld",&el);
			if (op==1) insereaza(Heap,el);
			else sterge(Heap,Timp[el]);
		}
	}
	fclose(fout);
	fclose(fin);
	return 0;
}