Cod sursa(job #379714)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 3 ianuarie 2010 15:53:54
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
# include <fstream.h>

ifstream f ("heapuri.in");
ofstream g ("heapuri.out");
int d[200005],i,k,n,z,nrr,y,sf,v[200005],aux,sff,min;

void sss (int k)
 {
	 if (k/2)
		 if (v[k/2]>v[k])
		 {
			 aux=v[k];
			 v[k]=v[k/2];
			 v[k/2]=aux;
			 sss (k/2);
		 }
}

void jjj (int k)
{
	if (2*k+1<=sf)
	{
		if (v[2*k]<v[2*k+1])
			min=2*k;
		else
			min=2*k+1;
		if (v[min]<v[k])
		{
			aux=v[min];
			v[min]=v[k];
			v[k]=aux;
			jjj (min);
		}
	}
	else
		if (2*k<=sf)
			if (v[2*k]<v[k])
			{
				aux=v[k];
				v[k]=v[2*k];
				v[2*k]=aux;
			}
}




void adauga (int x)
   {
	   sf++;
	   v[sf]=x;
	   sss (sf);
   }	   

  
	
	

    void mm (int k)
	{ int ok=0;
		if (k/2)
			
				if (v[k/2]>v[k])
				{
					sss (k);
			    	ok=1;
				}
		if (ok==0)
			jjj (k);
	}

	void sterg (int k)
	{
		v[k]=v[sf];
		sf--;
		mm (k);
	}

	void cauta (int q)
{
	if (v[q]==nrr)
	sterg (q);
	else
	{
		if (2*q+1<=sf)
			if (v[2*q+1]<=nrr)
			cauta (2*q+1);
		if (2*q<=sf)
			if (v[2*q]<=nrr)
				cauta (2*q);
	}
}
	
	

int main ()
	{
		f>>n;
		for (i=1;i<=n;i++)
		{
			f>>z;
			if (z==1)
			{
				f>>y;
				adauga (y);
				sff++;
				d[sff]=y;
			}
		     if (z==3)
				 g<<v[1]<<"\n";
		if (z==2)
		{
			f>>y;
			nrr=d[y];
			cauta (1);
			
		}
		
		}
		
		return 0;
	}