Cod sursa(job #584032)

Utilizator rendorzegAndrei Pavel rendorzeg Data 23 aprilie 2011 17:46:25
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
int n,crt,nr, a[200010], h[200010], p[200010];
void push(int x)
{
	int aux;
	while (x/2 && a[h[x]]<a[h[x/2]])
	{
		aux=h[x];
		h[x]=h[x/2];
		h[x/2]=aux;
		p[h[x]]=x;
		p[h[x/2]]=x/2;
		x/=2;
	}
}
void pop(int x)
{
	int aux,y=0;
	while (x!=y)
	{
		y=x;
		if (y*2<=crt && a[h[x]]>a[h[y*2]]) 
			x=y*2;
		if (y*2+1<=crt && a[h[x]]>a[h[y*2+1]]) 
			x=y*2+1;
		aux=h[x];
		h[x]=h[y];
		h[y]=aux;
		p[h[x]]=x;
		p[h[y]]=y;
	}
}

int main()
{
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	int i,x,k;
	scanf("%d ",&n);
	for (i=0; i<n; i++)
	{
		scanf("%d ",&k);
		switch(k)
		{
		case 1:
			scanf("%d ", &x);
			crt++; 
			nr++;
			a[nr]=x;
			h[crt]=nr;
			p[nr]=crt;
			push(crt);
			break;
		case 2:
			scanf("%d ", &x);
			a[x]=-1;
			push(p[x]);
			p[h[1]]=0;
			h[1]=h[crt--];
			p[h[1]]=1;
			if (crt>1) 
				pop(1);
			break;
		case 3: 
			printf("%d\n", a[h[1]]);
		}
	}
	return 0;
}