Cod sursa(job #629146)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 2 noiembrie 2011 18:24:25
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<algorithm>
using namespace std;

int n,tip,x,N,H[200010],P[200010];

void read(),solve(),heap_up(int),heap_down(int),insert(int),del(int);

int main()
{
	read();
	solve();
	
	return 0;
}

void read()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d",&n);
	
}

void solve()
{
		for(;n--;)
	{
		scanf("%d",&tip);if(tip==1 || tip==2)scanf("%d",&x);
		if(tip==1){P[++N]=N;insert(x);}
		if(tip==2)del(x);
		if(tip==3)printf("%d\n",H[1]);
	}
}

void insert(int val)
{
	H[N]=val;
	heap_up(N);
}

void del(int val)
{
	int nod=P[val];
	H[nod]=H[N--];
	
	if(nod>1 && H[nod]<H[nod/2])
		heap_up(nod);
	else
		heap_down(nod);
}

void heap_up(int nod)
{
	int key=H[nod],poz=P[nod];
	while(nod>1 && key<H[nod/2])
	{
		P[P[nod/2]]=nod;
		H[nod]=H[nod/2];
		nod=nod/2;
	}
	H[nod]=key;
	P[poz]=nod;
}

void heap_down(int nod)
{
	int fiu=1;
	while(fiu)
	{
		fiu=0;
		if(nod*2<=N && H[nod]>H[nod*2])fiu=nod*2;
		if(nod*2+1<=N && H[nod*2+1]<H[nod*2])fiu=nod*2+1;
		
		if(fiu)
		{
			int aux=P[P[nod]];
			P[P[nod]]=P[P[fiu]];
			P[P[fiu]]=aux;
			swap(H[nod],H[fiu]);
			nod=fiu;
		}
	}
}