Pagini recente » Cod sursa (job #765202) | Cod sursa (job #498810) | Cod sursa (job #3271159) | Cod sursa (job #550220) | Cod sursa (job #2165235)
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int N = 200001;
int n, v[N], nh, h[N], poz[N];
inline void myswap(int p, int q) {
int t1 = h[p], t2 = h[q];
poz[ h[p] ] = q;
poz[ h[q] ] = p;
swap(h[p], h[q]);
//swap(poz[t1], poz[t2]);
//poz[ h[p] ] = p;
//poz[ h[q] ] = q;
}
void urca(int p) {
while (p > 1 && v[ h[p] ] < v[ h[p >> 1] ]) {
myswap(p, p >> 1);
p >>= 1;
}
}
void coboara(int p) {
int st = p << 1, dr = (p << 1) + 1, best = p;
if (st <= nh && v[ h[best] ] > v[ h[st] ]) best = st;
if (dr <= nh && v[ h[best] ] > v[ h[dr] ]) best = dr;
if (best != p) {
myswap(best, p);
coboara(best);
}
}
void adauga(int p) {
h[++nh] = p;
poz[p] = nh;
urca(nh);
}
void sterge(int p) {
myswap(p, nh--);
urca(p);
coboara(p);
}
int main()
{
int op, len, x;
in >> len;
for (int i = 0; i < len; i++) {
in >> op;
if (op == 1) {
in >> x;
v[++n] = x;
adauga(n);
}
if (op == 2) {
in >> x;
sterge(poz[x]);
}
if (op == 3) out << v[ h[1] ] << '\n';
}
in.close();
out.close();
}