Cod sursa(job #395900)

Utilizator nautilusCohal Alexandru nautilus Data 13 februarie 2010 23:55:24
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include<fstream.h>
#define dmax 200001

long min=1000000001,min2=1000000001,sf,heap[dmax],poz[dmax],v[dmax];

void inserare(long k) /*inserarea elementului cu valoarea k*/
{
 long aux,auxsf;
	
 sf++;
 heap[sf]=k;
 poz[sf]=sf;
 v[sf]=sf;
 
 auxsf=sf;
 while (heap[auxsf]<heap[auxsf/2] && auxsf>=2) /*aranjez heapul*/
	 {
	  aux=heap[auxsf];
	  heap[auxsf]=heap[auxsf/2];
	  heap[auxsf/2]=aux;
	  
	  v[poz[auxsf/2]]=auxsf;
	  v[poz[auxsf]]=auxsf/2;
	  
	  aux=poz[auxsf];
	  poz[auxsf]=poz[auxsf/2];
	  poz[auxsf/2]=aux;
	  
	  auxsf=auxsf/2;
	 }
}

void stergere(int k) /*stergerea elementului adaugat al k-lea in heap*/
{
 long aux,auxsf;
	
 heap[v[k]]=heap[sf];
 poz[v[k]]=poz[sf];
 v[poz[sf]]=v[k];
 
 sf--;
 
 auxsf=v[k];
 while (heap[auxsf]<heap[auxsf/2] && auxsf>=2) /*aranjarea heapului in functie de tata*/
	 {
	  aux=heap[auxsf];
	  heap[auxsf]=heap[auxsf/2];
	  heap[auxsf/2]=aux;
	  
	  v[poz[auxsf/2]]=auxsf;
	  v[poz[auxsf]]=auxsf/2;
	  
	  aux=poz[auxsf];
	  poz[auxsf]=poz[auxsf/2];
	  poz[auxsf/2]=aux;
	  
	  auxsf=auxsf/2;
	 }
 
  while ((heap[auxsf]>heap[auxsf*2] || heap[auxsf]>heap[auxsf*2+1]) && auxsf<=sf/2) /*aranjarea heapului in functie de fii*/
	 {
	  if (heap[auxsf]>heap[auxsf*2]) /*fiul din stanga*/
		  {
		   aux=heap[auxsf];
		   heap[auxsf]=heap[auxsf*2];
		   heap[auxsf*2]=aux;
	  
		   v[poz[auxsf*2]]=auxsf;
		   v[poz[auxsf]]=auxsf*2;
	  
		   aux=poz[auxsf];
		   poz[auxsf]=poz[auxsf*2];
		   poz[auxsf*2]=aux;
	  
		   auxsf=auxsf*2;
		  } else
		  { 						/*fiul din dreapta*/
		   aux=heap[auxsf];
		   heap[auxsf]=heap[auxsf*2+1];
		   heap[auxsf*2+1]=aux;
	  
		   v[poz[auxsf*2+1]]=auxsf;
		   v[poz[auxsf]]=auxsf*2+1;
	  
		   aux=poz[auxsf];
		   poz[auxsf]=poz[auxsf*2+1];
		   poz[auxsf*2+1]=aux;
	  
		   auxsf=auxsf*2+1;
		  }
	 }
}

int main()
{
 long n,i,op,nr;
	
 ifstream fin("heapuri.in");
 fin>>n;
 ofstream fout("heapuri.out");
 
 for (i=1; i<=n; i++)
	 {
	  fin>>op;
	  if (op==1)
		  {
		   fin>>nr; 
		   inserare(nr);
		  } else
		  if (op==2)
			  {
			   fin>>nr;
			   stergere(nr);
			  } else
			  fout<<heap[1]<<'\n';
	 }
	
 fin.close();
 fout.close();
 
 return 0;
}