Cod sursa(job #703430)

Utilizator bogdan353Costea Bogdan bogdan353 Data 2 martie 2012 12:24:47
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>
using namespace std;

ifstream f("heapuri.in");

#define nmax 200002

int dimh=0,dimv=0,pozh[nmax],H[nmax],x[nmax],a,b,n;



void urca(int nod)
{
	if(nod==1) return;
	int tata=nod/2;
	
	if(x[H[nod]]>=x[H[tata]]) return ;
	
	swap(H[nod], H[tata]);
	swap(pozh[H[nod]], pozh[H[tata]]);
	
	urca(pozh[H[tata]]);
}

void coboara(int nod)
{
	int fiu1=nod*2;
	int fiu2=nod*2+1;
	int nodmin=nod;
	
	if(x[H[fiu1]]<x[H[nodmin]] && fiu1<=dimh)
		nodmin=fiu1;
	
	if(x[H[fiu1]]>x[H[nodmin]] && fiu2<=dimh)
		nodmin=fiu2;
	
	if(nod==nodmin) return;
	
	swap(H[nod],H[nodmin]);
	swap(pozh[H[nod]], pozh[H[nodmin]]);
	coboara(pozh[H[nodmin]]);
}


void inserare()
{
	f>>b;
	dimv++;
	x[dimv]=b;
	H[++dimh]=dimv;
	pozh[dimv]=dimh;
	urca(pozh[H[dimh]]);
}

void stergere()
{
	f>>b;
	int nod=pozh[b];
	swap(H[nod],H[dimh]);
	swap(pozh[H[nod]],pozh[H[dimh]]);
	dimh--;
	
	urca(pozh[H[nod]]);
	coboara(pozh[H[nod]]);
}
	



int main()
{
	
	ofstream g("heapuri.out");
	
	f>>n;
	
	for(int i=1;i<=n;i++)
	{
		f>>a;
		if(a==1) inserare();
		if(a==2) stergere();
		if(a==3) g<<x[H[1]]<<"\n";
	}
}