Pagini recente » Cod sursa (job #3248656) | Cod sursa (job #365534) | Cod sursa (job #1804201) | Cod sursa (job #2338895) | Cod sursa (job #1990421)
#include <cstdio>
const int MAXN = 2e5;
int v[MAXN], heap[MAXN], poz[MAXN], n;
inline int leftson(int n) {
return 2 * n + 1;
}
inline int rightson(int n) {
return 2 * n + 2;
}
inline int father(int n) {
return (n - 1) / 2;
}
inline void swap(int a, int b) {
int aux;
poz[heap[a]] = b;
poz[heap[b]] = a;
aux = heap[a];
heap[a] = heap[b];
heap[b] = aux;
}
inline void up(int p) {
while ((p) && (v[heap[p]] < v[heap[father(p)]])) {
swap(p, father(p));
p = father(p);
}
}
inline void down(int p) {
int x;
bool r;
r = 0;
while ((!r) && (leftson(p) < n)) {
x = leftson(p);
if ((rightson(p) < n) && (v[heap[rightson(p)]] < v[heap[x]])) {
x = rightson(p);
}
if (v[heap[x]] < v[heap[p]]) {
swap(p, x);
p = x;
} else {
r = 1;
}
}
}
inline void erase(int p) {
--n;
heap[poz[p]] = heap[n];
poz[heap[n]] = poz[p];
if ((v[heap[poz[p]]] < v[heap[father(poz[p])]]) && (poz[p])) {
up(poz[p]);
} else {
down(poz[p]);
}
}
inline void insert(int p) {
heap[n] = p;
poz[p] = n;
++n;
up(poz[p]);
}
int main() {
FILE *fin, *fout;
int t, x, op, p;
fin = fopen("heapuri.in", "r");
fscanf(fin, "%d", &t);
fout = fopen("heapuri.out", "w");
p = n = 0;
for (int i = 0; i < t; ++i) {
fscanf(fin, "%d", &op);
switch (op) {
case 1:
fscanf(fin, "%d", &x);
v[p] = x;
insert(p);
++p;
break;
case 2:
fscanf(fin, "%d", &x);
erase(x - 1);
break;
case 3:
fprintf(fout, "%d\n", v[heap[0]]);
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}