Cod sursa(job #267872)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 28 februarie 2009 13:13:46
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream.h>
#define inf 2000000000
#define Nmax 201000
ifstream f("heapuri.in");
ofstream g("heapuri.out");
long n,h[Nmax],k,m,nr,cr,poz[Nmax];
struct pozitie
{
long heap;
long cron;
}p[Nmax];

void urca(long k)
{
 long z,aj;
 while(h[k]<h[k/2] && k>1)
 {	z=h[k];
	h[k]=h[k/2];
	h[k/2]=z;
	aj=p[h[k]].heap;
	p[h[k]].heap=p[h[k/2]].heap;
	p[h[k/2]].heap=aj;
	k=k/2;
 }
}

int minim(long x)
{
 long min=0;

 for(long i=0;i<2;i++)
	if(h[x+i]<h[min] && h[x+i]<h[x/2] && x+i<=n)
	{
		min=x+i;
	}
 return min;
}

void coboara(long k)
{
 long min,z,gasit=1,aj;
 min=minim(k*2);
 while(gasit)
 {
	gasit=0;
	min=minim(k*2);
	if(min!=0)
	{
		z=h[k];
		h[k]=h[min];
		h[min]=z;
		aj=p[h[k]].heap;
		p[h[k]].heap=p[h[min]].heap;
		p[h[min]].heap=aj;
		gasit=1;
		k=min;
	}
 }

}

void citire()
{
 long z,i,x,nr;
 f>>m;
 for(i=0;i<m;i++)
 {
 f>>x;
 switch(x)
 {
 case 1:{	f>>nr;
		cr++;
		n++;
		h[n]=nr;
		p[nr].heap=n;
		p[nr].cron=cr;
		poz[cr]=nr;
		urca(n);
	   }
	   break;
 case 2:{ f>>nr;
		h[p[poz[nr]].heap]=h[n];
		p[h[n]].heap=p[poz[nr]].heap;
		n--;
		coboara(p[poz[nr]].heap);
	   }
	break;
 case 3:
	g<<h[1]<<'\n';
	break;
 }
 }
}

int main()
{
 h[0]=inf;
 citire();
 return 0;
}