Pagini recente » Cod sursa (job #2115560) | Cod sursa (job #667273) | Cod sursa (job #2541347) | Cod sursa (job #149477) | Cod sursa (job #2716270)
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
#define NMAX 200005
#define VMAX 1000000005
int nrop, n, poz[NMAX], v[NMAX], heap[NMAX], nre;
void actualizare_sus(int p) {
while (p / 2 && v[heap[p / 2]] > v[heap[p]]) {
swap(poz[heap[p / 2]], poz[heap[p]]);
swap(heap[p / 2], heap[p]);
p /= 2;
}
}
void actualizare_jos(int p) {
int dir = -1, mini = VMAX;
if (2 * p <= nre && v[heap[p]] > v[heap[2 * p]]) {
dir = 2 * p;
mini = v[heap[2 * p]];
}
if (2 * p + 1 <= nre && v[heap[p]] > v[heap[2 * p + 1]] && v[heap[2 * p + 1]] < mini)
dir = 2 * p + 1;
if (dir != -1) {
swap(poz[heap[p]], poz[heap[dir]]);
swap(heap[p], heap[dir]);
actualizare_jos(dir);
}
}
int main() {
f >> nrop;
int op, x;
for (int i = 1; i <= nrop; ++i) {
f >> op;
if (op == 1) {
f >> x;
v[++n] = x;
heap[++nre] = n;
poz[n] = nre;
actualizare_sus(nre);
} else if (op == 2) {
f >> x;
heap[poz[x]] = heap[nre];
poz[heap[nre]] = poz[x];
nre--;
actualizare_jos(poz[x]);
actualizare_sus(poz[x]);
} else
g << v[heap[1]] << '\n';
}
return 0;
}