Cod sursa(job #235660)

Utilizator AndreyPAndrei Poenaru AndreyP Data 24 decembrie 2008 23:55:41
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
//CRACIUN FERICIT
#include<stdio.h>
#define N 200010
int h[N],inh[N],n,v[N],nh,nv;
inline void swap(int &x,int &y)
{
	int aux=x;
	x=y;
	y=aux;
}
inline int father(int x)
{
	return x>>1;
}
inline int left_son(int x)
{
	return x<<1;
}
inline int right_son(int x)
{
	return (x<<1)+1;
}
void upheap(int k)
{
	int key=h[k];
	while(k>1 && v[key]<v[h[father(k)]])
	{
		h[k]=h[father(k)];
		inh[h[k]]=k;
		k=father(k);
	}
	h[k]=key;
	inh[h[k]]=k;
}
void downheap(int k)
{
	int son;
	do
	{
		son=0;
		if(left_son(k)<=nh)
		{
			son=left_son(k);
			if(right_son(k)<=nh)
			{
				if(v[h[right_son(k)]]<v[h[son]])
					son=right_son(k);
			}
		}
		if(v[h[son]]>=v[h[k]])
			son=0;
		if(son)
		{
			swap(h[son],h[k]);
			inh[h[k]]=k;
			inh[h[son]]=son;
			k=son;
		}
	}while(son);
}
int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d",&n);
	int cod;
	for(; n; n--)
	{
		scanf("%d",&cod);
		if(cod==1)
		{
			++nv;
			scanf("%d",&v[nv]);
			inh[nv]=++nh;
			h[nh]=nv;
			upheap(nh);
		}
		else
		if(cod==2)
		{
			int x;
			scanf("%d",&x);
			h[inh[x]]=h[nh];
			inh[h[nh]]=inh[x];
			--nh;
			downheap(inh[x]);
		}
		else
		if(cod==3)
			printf("%d\n",v[h[1]]);
	}
	return 0;
}