Cod sursa(job #276330)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 11 martie 2009 08:37:53
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<stdio.h>
#define Nmax 201000
#define inf 2000000000
int n,nr,sf,poz[Nmax];
struct heap
{
 int val,crt;
}h[Nmax];

int minim(int x)
{
 int min=0;
 for(int i=0;i<2;i++)
	if(h[x+i].val<h[min].val && h[x+i].val<h[x/2].val && x+i<=nr)
	{
		min=x+i;
	}
 return min;
}

void coboara(int k)
{
 int min,z,gasit=1;
 //min=minim(k*2);
 while(gasit)
 {
	gasit=0;
	min=minim(k*2);
	if(min!=0)
	{
		z=h[k].val;
		h[k].val=h[min].val;
		h[min].val=z;

		z=h[k].crt;
		h[k].crt=h[min].crt;
		h[min].crt=z;

		z=poz[h[k].crt];
		poz[h[k].crt]=poz[h[min].crt];
		poz[h[min].crt]=z;

		gasit=1;
		k=min;
	}
 }
}

void urca(int k)
{
 int z;
 while(h[k].val<h[k/2].val && k>1)
 {
	z=h[k].val;
	h[k].val=h[k/2].val;
	h[k/2].val=z;

	z=h[k].crt;
	h[k].crt=h[k/2].crt;
	h[k/2].crt=z;

	z=poz[h[k].crt];
	poz[h[k].crt]=poz[h[k/2].crt];
	poz[h[k/2].crt]=z;

	k=k/2;
 }
}

int main()
{
 freopen("heapuri.in","r",stdin);
 freopen("heapuri.out","w",stdout);
 scanf("%d",&n);
 h[0].val=inf;
 int i,op,x;
 for(i=1;i<=n;i++)
 {	scanf("%d",&op);
	if(op!=3)
		scanf("%d",&x);
	if(op==1)
	{	nr++;
		sf++;
		h[nr].val=x;
		h[nr].crt=sf;
		poz[sf]=nr;
		urca(nr);
	}
	if(op==2)
	{	h[poz[x]].val=h[nr].val;
		h[poz[x]].crt=h[nr].crt;
		poz[h[nr].crt]=poz[x];
		nr--;
		coboara(poz[x]);

	}
	if(op==3)
	printf("%d\n",h[1].val);

 }
 fclose(stdin);
 fclose(stdout);
 return 0;
}