Cod sursa(job #335387)

Utilizator crisojogcristian ojog crisojog Data 29 iulie 2009 20:07:38
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<stdio.h>
long h[200010],nr[200010];
long aux,n,i,j,k,x,a;

void up(long i)
{
	if(k==1)
		return;
	while(i>1)
	{
		if(h[i]<h[i/2])
		{
			aux=h[i];h[i]=h[i/2];h[i/2]=aux;
			aux=nr[i];nr[i]=nr[i/2];nr[i/2]=aux;
			i=i/2;
		}
		else return;
	}
}

long down(long j)
{
	while(1)
	{
		if(2*j>k) return j;
		aux=h[j];h[j]=h[j*2];h[j*2]=aux; 
		aux=nr[j];nr[j]=nr[j*2];nr[j*2]=aux;
		j=j*2;
	}
}
int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%ld",&n);
	for(i=1;i<=n;++i)
	{
		scanf("%d",&x);
		if(x==1)
		{
			scanf("%ld",&a);
			k++;h[k]=a;nr[k]=k;
			up(k);
		}
		if(x==2)
		{
			scanf("%ld",&a);
			for(j=1;j<=k;++j) if(nr[j]==a) break;
			j=down(j);
			aux=h[j];h[j]=h[k];h[k]=aux;
			aux=nr[j];nr[j]=nr[k];nr[k]=aux;
			k--; if(j!=k+1) up(j);
		}
		if(x==3) printf("%ld\n",h[1]);
	}
}