Pagini recente » Cod sursa (job #1511468) | Clasament preoni2008_clasa_a9-a_runda1 | Cod sursa (job #2950293) | Cod sursa (job #2196271) | Cod sursa (job #2198883)
#include <cstdio>
FILE *fin = fopen("heapuri.in", "r"), *fout = fopen("heapuri.out", "w");
#define MAXN 200000
int n, heap[MAXN + 1], poz[MAXN + 1], d[MAXN + 1];
inline int tata(int p) {
return p / 2;
}
inline int fiust(int p) {
return 2 * p;
}
inline int fiudr(int p) {
return 2 * p + 1;
}
inline void mySwap(int p, int q) {
int aux = heap[p];
heap[p] = heap[q];
heap[q] = aux;
poz[heap[p]] = p;
poz[heap[q]] = q;
}
inline void urcare(int p) {
if (p > heap[0]) return ;
while (p > 1 && d[heap[p]] < d[heap[tata(p)]]) {
mySwap(p, tata(p));
p = tata(p);
}
}
inline void coborare(int p) {
bool f = 1;
int q;
while (f && (q = fiust(p)) <= heap[0]) {
if (fiudr(p) <= heap[0] && d[heap[fiudr(p)]] < d[heap[q]])
q = fiudr(p);
if (d[heap[q]] < d[heap[p]]) {
mySwap(p, q);
p = q;
} else
f = 0;
}
}
inline void adauga(int x) {
n++;
heap[0]++;
heap[heap[0]] = n;
poz[n] = heap[0];
d[n] = x;
urcare(heap[0]);
}
inline void sterge(int x) {
int r = heap[heap[0]];
mySwap(poz[x], heap[0]);
heap[0]--;
urcare(poz[r]);
coborare(poz[r]);
}
int main() {
int q;
fscanf(fin, "%d", &q);
for (; q; q--) {
int t;
fscanf(fin, "%d", &t);
if (t == 1) {
int x;
fscanf(fin, "%d", &x);
adauga(x);
} else if (t == 2) {
int x;
fscanf(fin, "%d", &x);
sterge(x);
} else
fprintf(fout, "%d\n", d[heap[1]]);
}
fclose(fin);
fclose(fout);
return 0;
}