Cod sursa(job #625166)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 23 octombrie 2011 21:23:53
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;

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

const int N=200001;

struct element{
	int val;//valoarea elementului din heap
	int ord;//numar de ordine de adaugare in heap al elementului
}h[N];//vectorul heap;	

int hsize, poz_h[N],nrelem;//pozitia in heap pe care se afla elementul i bagat in multime si nr de elemente adaugate in multime

inline void schimba2(int x,int y){
	poz_h[x]^=poz_h[y];
	poz_h[y]^=poz_h[x];
	poz_h[x]^=poz_h[y];
}

inline void schimba(int a,int b){
	element aux;
	schimba2(h[a].ord,h[b].ord);
	aux=h[b];
	h[b]=h[a];
	h[a]=aux;
}

inline void adauga(int x){
	int aux;
	nrelem++;
	hsize++;
	h[hsize].val=x;
	h[hsize].ord=nrelem;
	poz_h[nrelem]=hsize;
	aux=hsize;
	while(h[aux/2].val>h[aux].val && aux/2){
		schimba(aux,aux/2);
		aux/=2;
	}
}

inline void coboara(int x){
	int aux;
	if(2*x>hsize)
		return;
	if(2*x==hsize)
		aux=2*x;
	else{
		if(h[2*x].val>h[2*x+1].val)
			aux=2*x+1;
		else
			aux=2*x;
	}
	schimba(aux,x);
	coboara(aux);
}

inline void elimina(int x){
	int aux;
	aux=poz_h[x];
	schimba(poz_h[x],hsize);
	poz_h[x]=0;
	hsize--;
	coboara(aux);
}
	

int main(){
	int n,i,op,aux;
	in>>n;
	for(i=1;i<=n;i++){
		in>>op;
		if(op==3){
			out<<h[1].val<<"\n";
			continue;
		}
		if(op==1){
			in>>aux;
			adauga(aux);
		}
		if(op==2){
			in>>aux;
			elimina(aux);
		}
	}
	return 0;
}