Cod sursa(job #1012971)

Utilizator dunhillLotus Plant dunhill Data 19 octombrie 2013 23:23:33
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
using namespace std;

#define NMAX 200001

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

int i, n, p, cod, x, N;

int val[NMAX], poz[NMAX];
int H[NMAX];

void UP_heap(int u) {
	H[++n] = u;
	u = n;
	while (u != 1 && val[H[u]] < val[H[u / 2]])
		swap(H[u], H[u / 2]), poz[H[u]] = u, poz[H[u / 2]] = u / 2, u /= 2;
}

void DOWN_heap(int u) {
	u = poz[u];
	swap(H[u], H[n]);
	poz[H[u]] = u;
	poz[H[n]] = n;
	--n;
	while (1) {
		int m = u;
		if (u * 2 <= n && val[H[u * 2]] < val[H[u]]) m = u * 2;
		if (u * 2 + 1 <= n && val[H[u * 2 + 1]] < val[H[m]]) m = u * 2 + 1;
		if (u == m) 
			break;
		swap(H[u], H[m]);
		poz[H[u]] = u;
		poz[H[m]] = m;
		u = m;
	}
}

int main() {
	fin >> N;
	for (i = 1; i <= N; ++i) {
		fin >> cod;
		if (cod != 3) {
			fin >> x;
			if (cod == 1) {
				val[++p] = x;
				poz[p] = p;
				UP_heap(p);
				continue;
			}
			DOWN_heap(x);
		}
		else
			fout << val[H[1]] << '\n';
	}
	return 0;
}