Cod sursa(job #404527)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 26 februarie 2010 11:55:01
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<stdio.h>
#define Nmax 200010

int v[Nmax],h[Nmax],poz[Nmax],q,n,N,i,x,op; 

void swap(int i, int j)
{
	int aux;
	poz[h[i]]=j;
	poz[h[j]]=i;
	aux=h[i]; h[i]=h[j]; h[j]=aux;
}

int pozmin(int i)
{
	if( (i<<1)+1 <= N)
		if( v[h[1+(i<<1)]] < v[h[i<<1]] ) return 1+(i<<1);
	return i<<1;
}

void down (int i)
{
	int k;
	if( i <= (N>>1) )
	{
		k=pozmin(i);
		if(v[h[k]]<v[h[i]])
		{
			swap(i,k);
			down(k);
		}
	}
}

void up(int i)
{
	if(i>1)
	{
		if(v[h[i>>1]]>v[h[i]])
		{
			swap(i,i>>1);
			up(i>>1);
		}
	}
}
void pop(int i)
{
	swap(i,N);
	N--;
	down(i);
}

int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	
	scanf("%d",&n);
	
	for(i=1;i<=n;i++)
	{
		scanf("%d",&op);
		
		if(op==1)
		{
			scanf("%d",&x);
			v[++q]=x;
			h[++N]=q;
			poz[q]=N;
			up(N);
		}
		else if(op==2)
		{
			scanf("%d",&x);
			pop(poz[x]);
		}
		else 
			printf("%d\n",v[h[1]]);
	}
	return 0;
}