Cod sursa(job #1013737)

Utilizator dunhillLotus Plant dunhill Data 21 octombrie 2013 17:34:45
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <algorithm>
using namespace std;

#define NMAX 200001
#define T (u >> 1)
#define L (u << 1)
#define R (L | 1)

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

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

int poz[NMAX];
int v[NMAX];
int H[NMAX];

inline void upheap(int u) {
	H[u] = u;
	poz[u] = u;
	while (u != 1 && v[H[u]] < v[H[T]]) swap(H[u], H[T]), poz[H[u]] = u, poz[H[T]] = T, u = T;
}

inline void downheap(int u) {
	u = poz[u];
	swap(H[u], H[n]);
	poz[H[n]] = n;
	poz[H[u]] = u;
	--n;
	while (1) {
		int m = u;
		if (L <= n && H[L] < H[m]) m = L;
		if (R <= n && H[R] < H[m]) m = R;
		if (m == u) 
			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 >> c;
		if (c != 3) {
			fin >> x;
			if (c == 1) {
				v[++p] = x;
				++n;
				upheap(n);
				continue;
			}
			downheap(x);
		}
		else
			fout << v[H[1]] << '\n';
	}
	return 0;
}