Pagini recente » Cod sursa (job #1340647) | Cod sursa (job #861590) | Cod sursa (job #55244) | Cod sursa (job #389923) | Cod sursa (job #1448258)
#include <cstdio>
#include <iostream>
using namespace std;
#define swap(a, b) a = a ^ b; b = a ^ b; a = a ^ b;
#define SIZE 200002
unsigned int heap[SIZE];
unsigned int poz1[SIZE];
unsigned int poz2[SIZE];
unsigned int dim;
void pushUp(int i) {
while(i > 1 && heap[i] < heap[i / 2]) {
swap(heap[i], heap[i / 2]);
swap(poz2[i], poz2[i / 2]);
poz1[poz2[i]] = i;
poz1[poz2[i / 2]] = i / 2;
i = i / 2;
}
}
void insert(int x, int p) {
heap[++dim] = x;
poz1[p] = dim;
poz2[dim] = p;
pushUp(dim);
}
void pushDown(int i) {
while(1) {
if(i * 2 > dim)
break;
if(i * 2 + 1 > dim) {
if(heap[i] > heap[i * 2]) {
swap(heap[i], heap[i * 2]);
swap(poz2[i], poz2[i * 2]);
poz1[poz2[i]] = i;
poz1[poz2[i * 2]] = i * 2;
i = i * 2;
continue;
}
else
break;
}
if(heap[i * 2] < heap[i * 2 + 1]) {
if(heap[i] > heap[i * 2]) {
swap(heap[i], heap[i * 2]);
swap(poz2[i], poz2[i * 2]);
poz1[poz2[i]] = i;
poz1[poz2[i * 2]] = i * 2;
i = i * 2;
continue;
}
else
break;
}
else {
if(heap[i] > heap[i * 2 + 1]) {
swap(heap[i], heap[i * 2 + 1]);
swap(poz2[i], poz2[i * 2 + 1]);
poz1[poz2[i]] = i;
poz1[poz2[i * 2 + 1]] = i * 2 + 1;
i = i * 2 + 1;
continue;
}
else{
break;
}
}
}
}
void erase(int p) {
heap[poz1[p]] = heap[dim];
poz2[poz1[p]] = poz2[dim];
--dim;
pushDown(poz1[p]);
}
int minim() {
return heap[1];
}
int main() {
unsigned int op1, op2, n, nr = 1;
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
cin >> n;
for(unsigned int i = 1; i <= n; ++i) {
cin >> op1;
if(op1 == 3) {
cout << minim() << '\n';
continue;
}
cin >> op2;
if(op1 == 1) {
insert(op2, nr);
++nr;
continue;
}
if(op1 == 2) {
erase(op2);
continue;
}
}
return 0;
}