Pagini recente » Cod sursa (job #1882644) | Cod sursa (job #2441892) | Cod sursa (job #1196765) | Cod sursa (job #720060) | Cod sursa (job #2354206)
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int MAXN = 200005;
int n, m;
int h[MAXN];
int nr;
int ord[MAXN], poz[MAXN];
int parent(int k) {
return k / 2;
}
int left(int k) {
return k * 2;
}
int right(int k) {
return k * 2 + 1;
}
void swapNode(int x, int y) {
swap(h[x], h[y]);
swap(poz[x], poz[y]);
ord[poz[x]] = x;
ord[poz[y]] = y;
}
void up(int k) {
while (parent(k) >= 1 && h[k] < h[parent(k)]) {
swapNode(k, parent(k));
k = parent(k);
}
}
void down(int k) {
int ok = 1;
while (ok > 0) {
int l = left(k);
int r = right(k);
ok = 0;
if (l <= n && h[l] < h[k]) {
ok = l;
}
if (r <= n) {
if (h[r] < h[k]) {
if (ok == 0 || h[r] < h[l]) {
ok = r;
}
}
}
if (ok > 0) {
swapNode(ok, k);
k = ok;
}
}
}
void add(int k) {
n++;
h[n] = k;
poz[n] = ++nr;
ord[nr] = n;
up(n);
}
void del(int k) {
swapNode(k, n);
n--;
if (k > 1 && h[k] < h[parent(k)]) {
up(k);
}
else {
down(k);
}
}
int main() {
fin >> m;
for (int i = 1; i <= m; ++i) {
int cer;
fin >> cer;
if (cer == 3) {
fout << h[1] << '\n';
}
else {
int k;
fin >> k;
if (cer == 1) {
add(k);
}
else {
del(ord[k]);
}
}
}
fout.close();
return 0;
}