Cod sursa(job #545579)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 3 martie 2011 16:50:08
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>
int a[200101],b[200101];
void h_up(int n,int m)
{
	int d=1,x;
	while(d && m>1)
	{
		d=0;
		if(a[m]<a[m/2])
		{
			x=a[m];
			a[m]=a[m/2];
			a[m/2]=x;
			m/=2;
		}
	}
}
void h_down(int n, int m)
{
	int fiu,x;
	do
	{
		fiu=0;
		if(m*2<=n)
		{
			fiu=m*2;
			if(fiu<n && a[fiu+1]<a[fiu])
				fiu++;
			else;
			if(a[fiu]<a[m])
			{
				x=a[fiu];
				a[fiu]=a[m];
				a[m]=x;
				m=fiu;
			}
			else
				fiu=0;
		}
	}while(fiu);
}
void del(int n,int m)
{
	a[m]=a[n];
	n--;
	if(a[m]<a[m/2])
		h_up(n,m);
	else
		h_down(n,m);
}

void rez1 (int n,int m)
{
	a[++n]=m;
	h_up(n,n);
}
void rez2(int n,int m)
{
	int x,i;
	for(i=1;i<=n;i++)
	{
		if(a[i]==m)
		{
			x=i;
			break;
		}
	}
	del(n,x);
}
int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	int n,i,t,m,u=0,q=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&t);
		if(t==1)
		{
			scanf("%d",&m);
			b[++q]=m;
			rez1(u,m);
			u++;
		}
		if(t==2)
		{
			scanf("%d",&m);
			rez2(u,b[m]);
			u--;
		}
		if(t==3)
			printf("%d\n",a[1]);
	}
	return 0;
}