Cod sursa(job #791167)

Utilizator Alexxino7Alexandru Popescu Alexxino7 Data 23 septembrie 2012 11:49:09
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
using namespace std;
#define NMax 200003

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

typedef int Heap[NMax];

Heap H;
int N,LH;
int Ord[NMax]; // Pozitia al-i-lui nod introdus in Heap
int HOrd[NMax]; // Numarul de ordine al-i-lui nod din Heap

inline int father(int X){
	return X/2;
}

inline int left_son(int X){
	return X*2;
}

inline int right_son(int X){
	return X*2+1;
}

void percolate(Heap H,int Dim,int K){
	int key=H[K],val=K;
	while(father(K)>0 && key<H[father(K)]){
		H[K]=H[father(K)];
		swap(Ord[val],Ord[father(K)]);
		swap(HOrd[K],HOrd[father(K)]);
		K=father(K);
	}
	H[K]=key;
	
}

void sift(Heap H,int Dim,int K){
	int son,val=K;
	do{
		son=0;
		if(left_son(K)<=Dim){
			son=left_son(K);
			
			if(right_son(K)<=N && H[right_son(K)]<H[left_son(K)])
				son=right_son(K);
			
			if(H[K]<=H[son])
				son=0;
		}
		
		if(son){
			swap(H[K],H[son]);
			swap(Ord[val],Ord[son]);
			swap(HOrd[K],HOrd[son]);
			K=son;
		}
		
	}while(son);
	
}

int main(){
	
	fin>>N;
	
	int x,y;
	for(int i=1;i<=N;i++){
		fin>>x;
		if(x==3)
			fout<<H[1]<<"\n";
		else if(x==2){
			fin>>y;
			H[Ord[y]]=H[Ord[HOrd[LH]]];
			Ord[HOrd[LH]]=Ord[y];
			HOrd[Ord[y]]=HOrd[LH];
			LH--;
			if(H[Ord[y]]<H[father(Ord[y])]){
				percolate(H,LH,Ord[y]);
			}
			else{
				sift(H,LH,Ord[y]);
			}
		}
		else{
			fin>>y;
			H[++LH]=y;
			Ord[LH]=LH;
			HOrd[LH]=LH;
			percolate(H,LH,LH);
		}
	}
	
	fin.close();
	fout.close();
	return 0;
}