Cod sursa(job #1012935)

Utilizator dunhillLotus Plant dunhill Data 19 octombrie 2013 22:13:32
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 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 / 2], H[u]), swap(poz[H[u / 2]], poz[H[u]]), u /= 2;
}

void DOWN_heap(int u) {
	poz[H[n]] = poz[H[poz[u]]];
	swap(H[poz[u]], H[n]);
	--n;
	u = poz[u];
	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]);
		swap(poz[H[u]], poz[H[m]]);
		u = m;
	}
}

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