Cod sursa(job #2843167)

Utilizator lucamLuca Mazilescu lucam Data 2 februarie 2022 10:03:21
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

std::ifstream in("heapuri.in");
std::ofstream out("heapuri.out");

const int N = 2e5;

int v[N], vt;
int h[N], ht;
int vp_to_hp[N];

inline bool h_cmp(int p1, int p2) {
	return v[h[p1]] <= v[h[p2]];
}

inline int h_parent(int p) {
	return (p - 1) / 2;
}

void h_swap(int p1, int p2) {
	std::swap(h[p1], h[p2]);
	std::swap(vp_to_hp[h[p1]], vp_to_hp[h[p2]]);
}

void h_update_up(int p) {
	while (p != 0 && h_cmp(p, h_parent(p))) {
		h_swap(p, h_parent(p));
		p = h_parent(p);
	}
}

void h_push(int x) {
	v[vt] = x;
	vp_to_hp[vt] = ht;
	h[ht] = vt;
	++ht;
	++vt;
	h_update_up(ht - 1);
}

void h_update_down(int p) {
	int l = 2 * p + 1, r = l + 1;
	int pmin = p;
	if (l < ht && h_cmp(l, pmin)) {
		pmin = l;
	}
	if (r < ht && h_cmp(r, pmin)) {
		pmin = r;
	}
	if (pmin != p) {
		h_swap(pmin, p);
		h_update_down(pmin);
	}
}

void h_remove(int p) {
	if (p == ht - 1) {
		--ht;
		return;
	}
	h_swap(p, ht - 1);
	--ht;
	h_update_up(p);
	h_update_down(p);
}

inline int h_top() {
	return v[h[0]];
}

int main() {
	int n;
	in >> n;
	for (int i = 0; i < n; ++i) {
		int op;
		in >> op;
		switch (op) {
		case 1: {
			int x;
			in >> x;
			h_push(x);
			break;
		}
		case 2: {
			int k;
			in >> k;
			h_remove(vp_to_hp[k - 1]);
			break;
		}
		case 3: {
			out << h_top() << '\n';
			break;
		}
		}
	}
}