Cod sursa(job #744563)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 9 mai 2012 01:50:05
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<vector>
using namespace std;

class heap{
public:
	vector <int> elem, pos, h;
	
	heap(){
		elem.assign(1, 0);
		pos.assign(1, 0);
		h.assign(1, 0);
	}
	
	void Coboara(int i){
		int fiu;
		
		while (i <= (elem.size() - 1)/ 2){
			fiu = 2 * i;
			if (fiu + 1 <= elem.size() - 1 && elem[pos[fiu+1]] < elem[pos[fiu]]) fiu++;
			if (elem[pos[i]] > elem[pos[fiu]]){
				swap(h[pos[i]], h[pos[fiu]]);
				swap(pos[i], pos[fiu]);
				i = fiu;
			}
			else break;
		}
	}
	
	void Urca(int i){
		int tata = i/2;
		
		while (i > 1 && elem[pos[i]] < elem[pos[tata]]){
			swap(h[pos[i]], h[pos[tata]]);
			swap(pos[i], pos[tata]);
			i = tata; tata = i/2;
		}
	}
	
	void Insereaza(int &x){
		int no = h.size(), n = pos.size();
		elem.push_back(x);
		h.push_back(n);
		pos.push_back(no);
		Urca(elem.size() - 1);
	}
	
	void Sterge(int &x){
		int i = h[x];
		swap(h[pos[elem.size() - 1]], h[pos[h[x]]]);
		swap(pos[elem.size() - 1], pos[h[pos[elem.size() - 1]]]);
		elem.pop_back(), h.pop_back();
		Coboara(i);
		Urca(i);
	}
} H;

int main(){
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	
	int i, cod, x, op;
	scanf ("%d", &op);
	for (i = 0; i < op; i++){
		scanf("%d", &cod);
		if (cod == 3) printf("%d\n", H.elem[H.pos[1]]);
		else{
			scanf("%d", &x);
			if (cod == 1) H.Insereaza(x);
				else H.Sterge(x);
		}
	}
	
	return 0;
}