Pagini recente » Cod sursa (job #887079) | Cod sursa (job #386918) | Cod sursa (job #1260879) | Cod sursa (job #1124098) | Cod sursa (job #488914)
Cod sursa(job #488914)
#include <cstdio>
#include <algorithm>
#define NMAX 200002
using namespace std;
int OP,n;
int ord[NMAX],nord;
struct {
int nod,ord;
}H[NMAX],aux;
void solve();
int main(){
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d ", &OP );
solve();
return 0;
}
void ridica(int k){
while(k!=1 && H[k].nod<H[k/2].nod){
aux=H[k];
H[k]=H[k/2];
H[k/2]=aux;
ord[H[k/2].ord]=k/2;
ord[H[k].ord]=k;
k/=2;
}
}
void coboara(int k){
int son;
do{
son =0;
if(2*k+1 <= n){
if( H[2*k].nod <= H[2*k+1].nod ){
son = 2*k;
}
else {
son = 2*k+1;
}
}
else{
if(2*k == n){
son = 2*k;
}
}
if( H[k].nod <= H[son].nod ){
son = 0;
}
if(son){
aux=H[k];
H[k]=H[son];
H[son]=aux;
ord[H[son].ord]=son;
ord[H[k].ord]=k;
k=son;
}
}while(son);
}
void clean(int k){
if(k!=1 && H[k].nod<H[k/2].nod){
ridica(k);
}
else{
coboara(k);
}
}
void solve(){
int op,x;
for(int nrOP=1 ; nrOP<=OP ; ++nrOP){
scanf("%d ", &op);
if(op != 3){
scanf("%d ", &x);
if(op==1){
H[++n].nod=x;
ord[++nord]=nord;
H[n].ord=nord;
ridica(n);
}
else{
H[ord[x]]=H[n];
ord[H[n].ord]=ord[x];
n--;
clean(ord[x]);
}
}
else{
printf("%d\n", H[1].nod);
}
}
}