Pagini recente » Cod sursa (job #783777) | Cod sursa (job #1459055) | Cod sursa (job #327341) | Cod sursa (job #669310) | Cod sursa (job #2843167)
#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;
}
}
}
}