Pagini recente » Cod sursa (job #1297666) | Cod sursa (job #1737401) | Cod sursa (job #1765541) | Cod sursa (job #551843) | Cod sursa (job #2047833)
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int Nmax = 200001;
int n, lg, nr, v[Nmax], poz[Nmax], heap[Nmax];
int father(int k) {
return k / 2;
}
int left_son(int k) {
return k * 2;
}
int right_son(int k) {
return k * 2 + 1;
}
void add(int Heap[Nmax], int n, int k) {
while(k > 1 && v[heap[k]] < v[heap[father(k)]]) {
swap(heap[k], heap[father(k)]);
poz[heap[k]] = k;
poz[heap[father(k)]] = father(k);
k = father(k);
}
}
void sterge(int Heap[Nmax], int n, int k) {
if(father(k) > 1 && v[Heap[k]] < v[Heap[father(k)]])
add(Heap, n, k);
else {
int son;
do {
son = 0;
if(left_son(k) <= n) {
son = left_son(k);
if(right_son(k) <= n && v[Heap[right_son(k)]] < v[Heap[son]])
son = right_son(k);
}
if(son) {
swap(Heap[k], Heap[son]);
poz[Heap[k]] = k;
poz[Heap[son]] = son;
k = son;
}
}while(son);
}
}
int main()
{
int i, x, val, pozitie;
f>>n;
for(i = 1; i <= n; i++) {
f>>x;
if(x < 3) f>>val;
if(x == 1) {
v[++nr] = val;
heap[++lg] = nr;
poz[nr] = lg;
add(heap, lg, lg);
} else if(x == 2) {
pozitie = poz[val];
heap[pozitie] = heap[lg];
poz[heap[pozitie]] = pozitie;
heap[lg--] = 0; v[val] = -1;
sterge(heap, lg, pozitie);
} else
g<<v[heap[1]]<<'\n';
}
return 0;
}