Cod sursa(job #776777)

Utilizator cameleonGeorgescu Dan cameleon Data 10 august 2012 13:27:21
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
using namespace std;
#define NMAX 200005
ifstream f("heapuri.in");
ofstream g("heapuri.out");

struct elem{
	int x,nr;
};
elem h[NMAX];
int n, poz[NMAX],ne=0;

void urc(int k)
{
	if(k/2)//daca exista tata (nu este radacina)
		if(h[k/2].x>h[k].x) //daca este mai mic decat tatal
		{//le interschimbam
			poz[h[k].nr]=k/2;poz[h[k/2].nr]=k;
			elem z=h[k];
			h[k]=h[k/2];
			h[k/2]=z;
			urc(k/2);
		}
	
}
void cobor(int k)
{
	//trecem ultimul element pe poz k
	h[k]=h[ne];poz[h[ne].nr]=k;
	//coboram elem de pe k pana sta bine
	while(2*k<=ne)//are cel putin un fiu
	{
		int min=2*k;// cel mai mic fiu
		if(2*k+1<=ne)
		{
			if(h[min].x>h[2*k+1].x)min=2*k+1;
		}
		if(h[k].x>h[min].x)//este mai mare decat cel mai mic fiu
		{//interschimbam cu fiul
			poz[h[k].nr]=min;poz[h[min].nr]=k;
			elem z=h[k];
			h[k]=h[min];
			h[min]=z;
			k=min;
		}
		else break;
	}
	--ne;
	
}
int main()
{
	f>>n;
	int nr=0;//nr elementului introdus
	//ne nr elementelor din heap
	for(int i=1;i<=n;++i)
	{
		int op,x;
		f>>op;
		switch(op)
		{
		case 1:
			f>>h[++ne].x;
			nr++;
			h[ne].nr=nr;
			poz[nr]=ne;//elementul nr se gaseste pe poz ne in heap
			urc(ne);break;
		case 2:
			f>>x;
			cobor(poz[x]);break;
		case 3:
			g<<h[1].x<<'\n';break;
		}
	}
	
	return 0;
}