Cod sursa(job #633583)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 14 noiembrie 2011 02:27:20
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<cstdio>
using namespace std;

int A[200001], pos[200001], h[200001], n, no;

void Interschimba(int &x, int &y){
	int aux;
	aux = y; y = x; x = aux;
}

void Coboara(int i){
	int fiu;
	
	while (i <= n/2){
		fiu = 2 * i;
		if (fiu + 1 <= n && A[pos[fiu+1]] < A[pos[fiu]]) fiu++;
		if (A[pos[i]] > A[pos[fiu]]){
			Interschimba(h[pos[i]], h[pos[fiu]]);
			Interschimba(pos[i], pos[fiu]);
			i = fiu;
		}
		else break;
	}
}

void Urca(int i){
	int tata = i/2;
	
	while (i > 1 && A[pos[i]] < A[pos[tata]]){
		Interschimba(h[pos[i]], h[pos[tata]]);
		Interschimba(pos[i], pos[tata]);
		i = tata; tata = i/2;
	}
}

void Insereaza(int &x){
	h[++n] = ++no;
	pos[n] = n;
	A[no] = x;
	Urca(n);
}

void Sterge(int &x){
	int i = h[x];
	Interschimba(h[pos[n]], h[pos[h[x]]]);
	Interschimba(pos[n], pos[h[pos[n]]]);
	n--;
	Coboara(i);
	Urca(i);
}

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", A[pos[1]]);
		else{
			scanf("%d", &x);
			if (cod == 1) Insereaza(x);
				else Sterge(x);
		}
	}
	
	return 0;
}