Cod sursa(job #792003)

Utilizator Alexxino7Alexandru Popescu Alexxino7 Data 26 septembrie 2012 09:34:22
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
using namespace std;
#define Maxim 200005

int Val[Maxim],Heap[Maxim],Poz[Maxim];
int N,LG,NR;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

void move_up(int X,int N){
	
	int aux;
	while(X/2 && Val[Heap[X]]<Val[Heap[X/2]]){
		
		aux=Heap[X];
		Heap[X]=Heap[X/2];
		Heap[X/2]=aux;
		
		Poz[Heap[X]]=X;
		Poz[Heap[X/2]]=X/2;
		
		X/=2;
	}
}

void move_down(int X,int N){
	int son,aux;
	do{
		son=0;
		if(2*X<=N && Val[Heap[X]]>Val[Heap[2*X]]){
			son=2*X;
			if(2*X+1<=N && Val[Heap[X]]>Val[Heap[2*X+1]] && Val[Heap[son]]<Val[Heap[2*X+1]])
				son=2*X+1;
		}
		if(son){
			aux=Heap[X];
			Heap[X]=Heap[son];
			Heap[son]=aux;
			
			Poz[Heap[X]]=X;
			Poz[Heap[son]]=son;
		}
	}while(son);
}

int main(){
	
	fin>>N;
	
	Val[0]=99999999;
	int x,y,i;
	for( i=1;i<=N;i++){
		fin>>x;
		if(x==1){
			
			fin>>y;
			Val[++NR]=y;
			Heap[++LG]=NR;
			Poz[NR]=LG;
			
			move_up(LG,LG);
			
		}
		if(x==2){
			
			fin>>y;
			Heap[Poz[y]]=Heap[LG];
			Poz[Heap[LG]]=Poz[y];
			Poz[y]=-1;
			LG--;
			if(Val[Heap[Poz[y]]]<Val[Heap[Poz[y]/2]])
				move_up(Poz[Heap[LG+1]],LG);
			else
				move_down(Poz[Heap[LG+1]],LG);
		}
		if(x==3){
			fout<<Val[Heap[1]]<<"\n";
		}
	}
	
	fin.close();
	fout.close();
	return 0;
}