Cod sursa(job #662958)

Utilizator bogdan353Costea Bogdan bogdan353 Data 17 ianuarie 2012 15:08:55
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>
#include<algorithm>
using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

int n,sir[200002],H[200002],pozH[200002],dim,dimH;

void push(int nod)
{
	int tata=nod/2;
	if(nod==1) return ;
	if(sir[H[nod]]>=sir[H[tata]]) return;
	swap(H[nod],H[tata]);
	swap(pozH[H[nod]],pozH[H[tata]]);
	push(pozH[H[tata]]);
}

void pop(int nod)
{
	int f1=nod*2;
	int f2=nod*2+1;
	int nodmin=nod;
	

	if(sir[H[f1]]<sir[H[nodmin]] && f1<=dimH)
		nodmin=f1;
	if(sir[H[f2]]<sir[H[nodmin]] && f2<=dimH)
		nodmin=f2;
	
	if(nod==nodmin) return;
	
	
		swap(H[nod],H[nodmin]);
		swap(pozH[H[nod]],pozH[H[nodmin]]);
		pop(pozH[H[nodmin]]);
	

}
	
	void adaug()
{
	int x;
	f>>x;
	dim++;
	sir[dim]=x;
	dimH++;
	H[dimH]=dim;
	pozH[dim]=dimH;
	push(pozH[H[dimH]]);
}

void sterg(int x)
{
	
	swap(H[x],H[dimH]);
	swap(pozH[H[x]],pozH[H[dimH]]);
	dimH--;
	
	push(pozH[H[x]]);
	pop(pozH[H[x]]);
}



int main()
{
	f>>n;

	for(int i=1;i<=n;i++)
	{
		int a;
		f>>a;
		
		if(a==1) adaug();
		if(a==2)
		{
			int x;
			f>>x;
			sterg(pozH[x]);
		}
		if(a==3) g<<sir[H[1]]<<"\n";
	}
}