Cod sursa(job #488915)

Utilizator barneystinsonBarney barneystinson Data 30 septembrie 2010 16:21:10
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <algorithm>
#define NMAX 200002
using namespace std;

int OP,n;
int ord[NMAX],nord;

struct {
	int nod,ord;
}H[NMAX],aux;

void solve();

int main(){
	
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	
	scanf("%d ", &OP );
	solve();
	
	return 0;
}

void ridica(int k){
	
	while(k!=1 && H[k].nod<H[k/2].nod){
		aux=H[k];
		H[k]=H[k/2];
		H[k/2]=aux;
		ord[H[k/2].ord]=k/2;
		ord[H[k].ord]=k;
		k/=2;
	}
}

void coboara(int k){
	int son;
	
	do{
		son =0;
		if(2*k+1 <= n){
			if( H[2*k].nod <= H[2*k+1].nod ){
				son = 2*k;
			}
			else {
				son = 2*k+1;
			}
		}
		else{
			if(2*k == n){
				son = 2*k;
			}
		}
		if( H[k].nod <= H[son].nod ){
			son = 0;
		}
		
		if(son){
			aux=H[k];
			H[k]=H[son];
			H[son]=aux;
			ord[H[son].ord]=son;
			ord[H[k].ord]=k;
			k=son;
		}
		
	}while(son);
	
}

void clean(int k){
	
	if(k!=1 && H[k].nod<H[k/2].nod){
		ridica(k);
	}
	else{
		coboara(k);
	}
	
}

void solve(){
	int op,x;
	for(int nrOP=1 ; nrOP<=OP ; ++nrOP){
		
		scanf("%d ", &op);
		if(op != 3){
			scanf("%d ", &x);
			if(op==1){
				H[++n].nod=x;
				ord[++nord]=nord;
				H[n].ord=nord;
				ridica(n);
				
			}
			else{
				
				H[ord[x]]=H[n];
				ord[H[n].ord]=ord[x];
				n--;
				clean(ord[x]);
				
			}
		}
		else{
			printf("%d\n", H[1].nod);
		}
		
	}
	
}