Pagini recente » Cod sursa (job #2029661) | Cod sursa (job #2162443) | Cod sursa (job #2377761) | Cod sursa (job #757591) | Cod sursa (job #2325847)
#include <fstream>
#define MAXN 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct two{
int val, poz;
};
two heap[MAXN * 2];
int fr[MAXN], N, NN;
inline void Add(int neww) {
int dad, son; NN++;
heap[NN] = {neww, NN}; fr[heap[NN].poz] = NN;
dad = NN / 2; son = NN;
while (dad > 0 && heap[son].val < heap[dad].val) {
swap(heap[son], heap[dad]);
fr[heap[son].poz] = son; fr[heap[dad].poz] = dad;
son = dad; dad /= 2;
}
}
inline int Det_min(int left_son, int right_son) {
if (heap[left_son].val < heap[right_son].val)
return left_son;
return right_son;
}
inline void Delete(int poz) {
int dad, left_son, right_son, auxi, son;
heap[poz] = heap[NN--];
fr[heap[poz].poz] = poz;
dad = poz;
left_son = dad * 2; right_son = dad * 2 + 1;
while (left_son <= NN) {
auxi = 0;
if (right_son <= NN) {
auxi = Det_min(left_son, right_son);
}
else
auxi = left_son;
if (heap[dad].val > heap[auxi].val) {
fr[heap[dad].poz] = auxi;
fr[heap[auxi].poz] = dad;
swap(heap[dad], heap[auxi]);
dad = auxi; left_son = dad * 2; right_son = left_son + 1;
}
else
break;
}
dad = poz / 2; son = poz;
while (dad > 0 && heap[son].val < heap[dad].val) {
swap(heap[son], heap[dad]);
fr[heap[son].poz] = son; fr[heap[dad].poz] = dad;
son = dad; dad /= 2;
}
}
inline void Read() {
int tip, x;
fin >> N;
for (int i = 1; i <= N; i++) {
fin >> tip;
if (tip == 1) {
fin >> x;
Add(x);
}
else if (tip == 2) {
fin >> x;
Delete(fr[x]);
}
else
fout << heap[1].val << "\n";
}
}
int main () {
Read();
fin.close(); fout.close(); return 0;
}