Cod sursa(job #744569)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 9 mai 2012 03:08:06
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<vector>
using namespace std;

class heap{
	vector <int> elem, pos, h;
	
	void Down_Heap(int i){
		int fiu;
		
		while (i <= (int)(pos.size() - 1) / 2){
			fiu = 2 * i;
			if (fiu + 1 <= (int)pos.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 Up_Heap(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;
		}
	}
public:	
	heap(){
		elem.assign(1, 0);
		pos.assign(1, 0);
		h.assign(1, 0);
	}
	
	void insert(int &x){
		pos.push_back(h.size());
		h.push_back(pos.size() - 1);
		elem.push_back(x);
		Up_Heap(pos.size() - 1);
	}
	
	void erase(int &x){
		int i = h[x];
		swap(h[pos[pos.size() - 1]], h[pos[h[x]]]);
		swap(pos[pos.size() - 1], pos[h[pos[pos.size() - 1]]]);
		pos.pop_back();
		Down_Heap(i);
		Up_Heap(i);
	}
	
	int top(){ return elem[pos[1]]; }
} 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.top());
		else{
			scanf("%d", &x);
			if (cod == 1) H.insert(x);
				else H.erase(x);
		}
	}
}