Cod sursa(job #504289)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 27 noiembrie 2010 12:53:35
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<cstdio>
#include<algorithm>

using namespace std;

const int Nmax = 200005;

int H[Nmax], A[Nmax], poz[Nmax], N, Nr;

void Heap_Up(int k) {
	while(k>1 && H[k]<H[k/2]) {
		swap(H[k],H[k/2]);
		swap(A[k],A[k/2]);
		poz[A[k]]=k;
		poz[A[k/2]]=k/2;
		k/=2;
	}
}

void insert(int val) {
	N++; Nr++;
	H[N]=val;
	A[N]=Nr;
	poz[Nr]=N;
	Heap_Up(N);
}

void Heap_Down(int k) {
	int son=k;
	if(2*k<=N && H[2*k]<H[son])
		son=2*k;
	if(2*k+1<=N && H[2*k+1]<H[son]) 
		son=2*k+1;
	if(son!=k) {
		swap(H[k],H[son]);
		swap(A[k],A[son]);
		poz[A[k]]=k;
		poz[A[son]]=son;
		Heap_Down(son);
	}
}

void erase(int ord) {
	int k;
	k=poz[ord];
	H[k]=H[N];
	N--;
	if(k>1 && H[k]<H[k/2])
		Heap_Up(k);
	else
		Heap_Down(k);
}

int main() {
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	
	int M, val, tip, ord;
	
	for(scanf("%d",&M); M; --M) {
		scanf("%d",&tip);
		switch(tip) {
			case 1:
				scanf("%d",&val);
				insert(val);
				break;
			case 2:
				scanf("%d",&ord);
				erase(ord);
				break;
			case 3:
				printf("%d\n",H[1]);
				break;
		}
	}
	
	return 0;
}