Cod sursa(job #379782)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 3 ianuarie 2010 22:10:55
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
# include <fstream.h>

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

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

void jjj (int k)
{
	if (2*k+1<=sf)
	{
		if (a[v[2*k]]<a[v[2*k+1]])
			min=2*k;
		else
			min=2*k+1;
		if (a[v[min]]<a[v[k]])
		{
			aux=v[min];
			v[min]=v[k];
			v[k]=aux;
			poz[v[min]]=min;
			poz[v[k]]=k;
			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;
				poz[v[k]]=k;
				poz[v[2*k]]=2*k;
			}
}




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

  
	
	

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

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

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