Pagini recente » Cod sursa (job #1895068) | Cod sursa (job #291417) | Cod sursa (job #2595802) | Cod sursa (job #569376) | Cod sursa (job #1733279)
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <math.h>
#include <map>
#define INPUT "heapuri.in"
#define OUTPUT "heapuri.out"
#define NMAX 200010
using namespace std;
ifstream f(INPUT);
ofstream g(OUTPUT);
int v[NMAX],v_size,n;
map<int,int> pozEl;
int cron[NMAX],cron_size,op,op1;
inline int father(int el){return el/2;}
inline int leftSon(int el){return 2*el;}
inline int rightSon(int el){return 2*el+1;}
void urca(int i){
int el;
for(el=v[i];i>1 && v[father(i)] > el;){
v[i]=v[father(i)];
pozEl[v[i]]=i;
i=father(i);
}
v[i]=el;
pozEl[v[i]]=i;
}
void coboara(int i){
int son;
do{
son=0;
if(leftSon(i) <= v_size){
son = leftSon(i);
if(rightSon(i) <= v_size && v[rightSon(i)] < v[son])
son=rightSon(i);
if(v[i] < v[son])
son=0;
}
if(son){
swap(v[i],v[son]);
pozEl[v[i]]=i;
pozEl[v[son]] = son;
i=son;
}
}while(son);
}
void adauga(int el){
v[++v_size] = el;
cron[++cron_size]=el;
urca(v_size);
}
void stergePoz(int i){
swap(v[v_size--],v[i]);
if(father(i)>=1 && v[father(i)] > v[i])
urca(i);
else coboara(i);
}
void stergeCron(int poz){
stergePoz(pozEl[cron[poz]]);
}
int main(){
f >> n;
for(int i=1;i<=n;i++){
f >> op;
if(op == 1){
f >> op1;
adauga(op1);
}
else if(op == 2){
f >> op1;
stergeCron(op1);
}
else g << v[1] << '\n';
}
return 0;
}