Cod sursa(job #327986)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 30 iunie 2009 18:14:42
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>
int n,nh;
int v[200002];
int h[200002];
int poz[200002];

void heap_up(int nod)
{
	if((nod>>1)==0)
		return;
	if(v[h[nod>>1]]>v[h[nod]])
	{
		int aux;
		poz[h[nod]]=nod>>1;
		poz[h[nod>>1]]=nod;
		aux=h[nod>>1];
		h[nod>>1]=h[nod];
		h[nod]=aux;
		heap_up(nod>>1);
	}
}

void heap_down(int nod)
{
	int fiu=nod;
	if((nod<<1) <= nh && v[h[nod<<1]] < v[h[fiu]])
		fiu=(nod<<1);
	if((nod<<1)+1 <= nh && v[h[(nod<<1)+1]] < v[h[fiu]])
		fiu=(nod<<1)+1;
	if(fiu!=nod)
	{
		int aux;
		poz[h[nod]]=fiu;
		poz[h[fiu]]=nod;
		aux=h[fiu];
		h[fiu]=h[nod];
		h[nod]=aux;
		heap_down(fiu);
	}
}

void read()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	int m,a,b;
	scanf("%d",&m);
	while(m--)
	{
		scanf("%d",&a);
		if(a==3)
		{
			printf("%d\n",v[h[1]]);
			continue;
		}
		if(a==2)
		{
			scanf("%d",&b);
			h[poz[b]]=h[nh];
			poz[h[nh]]=poz[b];
			nh--;
			heap_up(poz[b]);
			heap_down(poz[b]);
		}
		if(a==1)
		{
			scanf("%d",&v[++n]);
			h[++nh]=n;
			poz[n]=nh;
			heap_up(nh);
		}
	}
}

int main()
{
	read();
	return 0;
}