Pagini recente » Cod sursa (job #2142850) | Cod sursa (job #146172) | Cod sursa (job #2902345) | Cod sursa (job #3203915) | Cod sursa (job #1770402)
#include <bits/stdc++.h>
#define NMax 200001
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
vector<int> heap;
int n,p,x,nr;
int node[NMax],order[NMax];
void add(vector<int> &heap, int x){
heap.push_back(x);
int i = heap.size() - 1;
while(heap[(i - 1) / 2] > heap[i] && i > 0){
swap(heap[(i - 1) / 2], heap[i]);
node[order[i]] = (i - 1) / 2;
node[order[(i - 1) / 2]] = i;
swap(order[i],order[(i - 1) / 2]);
i = (i - 1) / 2;
}
}
void del(vector<int> &heap, int x){
swap(heap[x],heap[heap.size() - 1]);
heap.pop_back();
int n = heap.size();
int i = x;
while(i < n){
int son = -1;
if(heap[2 * i + 1] < heap[i] && 2 * i + 1 < n){
son = 2 * i + 1;
}
if(heap[2 * i + 2] < heap[i] && 2 * i + 2 < n){
if(son == -1)
son = 2 * i + 2;
else
if(heap[2 * i + 2] < heap[2 * i + 1])
son = 2 * i + 2;
}
if(son == -1)
break;
swap(heap[i], heap[son]);
node[order[i]] = son;
node[order[son]] = i;
swap(order[i],order[son]);
i = son;
}
}
int main()
{
f >> n;
for(int i = 1; i <= n; ++i){
f >> p;
if(p == 1){
f >> x;
node[nr] = heap.size();
order[heap.size()] = nr;
++nr;
add(heap,x);
}
if(p == 2){
f >> x;
del(heap,node[x - 1]);
}
if(p == 3){
g << heap[0] << '\n';
}
}
return 0;
}