Cod sursa(job #708563)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 6 martie 2012 22:12:35
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<cstdio>
#define nmax 200001
int n,cod,x,heap[nmax],poz[nmax],ord[nmax],nr,ncrt;
void insert(int val)
{
	int child, dad, aux;
	child=++nr;
	heap[child]=val;
	poz[child]=child;
	ord[child]=++ncrt;
	if(child==1)
		return;
	else
		for(;;)
		{
			dad=child/2;
			if(heap[poz[dad]]<=heap[poz[child]])
				return;
			aux=poz[dad];
			poz[dad]=poz[child];
			poz[child]=aux;
			ord[poz[dad]]=dad;
			ord[poz[child]]=child;
			child=dad;
		}
}
void refresh(int dad)
{
	int child=2*dad;
	int val=poz[dad];
	while(child<=nr)
	{
		if(child<nr)
			if(heap[poz[child]]>heap[poz[child+1]])
				child++;
		if(heap[poz[dad]]>heap[poz[child]])
		{
			val=poz[dad];
			poz[dad]=poz[child];
			dad=child;
			child=2*child;
		}
		else
			break;
	}
	poz[dad]=val;
}
int main()
{
	int i;
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d", &n);
	for(i=1;i<=n;i++)
	{
		scanf("%d", &cod);
		if(cod<3)
		{
			scanf("%d", &x);
			if(cod==1)
				insert(x);
			else
			{
				poz[ord[x]]=poz[nr];
				nr--;
				refresh(ord[x]);
				ord[x]=0;
			}
		}
		else
			printf("%d\n", heap[poz[1]]);
	}
	return 0;
}