Cod sursa(job #418622)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 16 martie 2010 10:06:09
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
//Minheap
#include<stdio.h>
#define Nmax 200010
int vec[Nmax],n,nr,ot[Nmax],nrcrt;
struct heap
{
	int val,crt;
}h[Nmax];
void urca(int poz,int n)
{
	heap aj;
	int aj2;
	if(poz>1)
		if(h[poz].val<h[poz/2].val)
		{
			aj=h[poz];
			h[poz]=h[poz/2];
			h[poz/2]=aj;
			
			aj2=ot[h[poz].crt];
			ot[h[poz].crt]=ot[h[poz/2].crt];
			ot[h[poz/2].crt]=aj2;
			
			urca(poz/2,n);
		}
}

int min(int poz,int n)
{
	if(2*poz+1<=n)
		if(h[2*poz].val<h[2*poz+1].val)
			return 2*poz;
		else
			return 2*poz+1;
	else
		return 2*poz;
			
}

void coboara(int poz,int n)
{
	int aj,aj2;
	heap z;
	if(2*poz<=n)
	{
		aj=min(poz,n);
		if(h[aj].val<h[poz].val)
		{
			z=h[aj];
			h[aj]=h[poz];
			h[poz]=z;
			
			aj2=ot[h[aj].crt];
			ot[h[aj].crt]=ot[h[poz].crt];
			ot[h[poz].crt]=aj2;

			coboara(aj,n);
		}
	}
}

int main()
{
	int op,val;
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&op);
		switch(op)
		{
		case 1:{scanf("%d",&val);
				nr++;
				nrcrt++;
				h[nr].val=val;
				h[nr].crt=nrcrt;
				ot[nrcrt]=nr;
				urca(nr,nr);
				}break;
		case 2:{scanf("%d",&val);
				h[ot[val]]=h[nr];
				ot[h[nr].crt]=ot[val];
				nr--;
				coboara(ot[val],nr);
				}break;
		case 3:printf("%d\n",h[1].val);break;
		}
	}
	return 0;
}