Pagini recente » Cod sursa (job #798926) | Cod sursa (job #2397444) | Cod sursa (job #133588) | Cod sursa (job #935695) | Cod sursa (job #637994)
Cod sursa(job #637994)
#include<stdio.h>
#define nmax 200020
int heap[nmax],poz_elem[nmax],elem[nmax],nr_op,lg_heap,nr_elem;
void add(int &lg_heap,int num){
++lg_heap;
int ppoz=lg_heap;
while(ppoz>1 && num<heap[ppoz/2]){
heap[ppoz]=heap[ppoz/2];
elem[ppoz]=elem[ppoz/2];
poz_elem[elem[ppoz]]=ppoz;
ppoz=ppoz/2;
}
heap[ppoz]=num;
elem[ppoz]=nr_elem;
poz_elem[elem[ppoz]]=ppoz;
}
void del(int &lg_heap,int ppoz,int num){
heap[ppoz]=heap[lg_heap];
elem[ppoz]=elem[lg_heap];
poz_elem[elem[ppoz]]=ppoz;
lg_heap--;
int test,pfiu;
do{
test=0;
if(ppoz*2<=lg_heap){
pfiu=ppoz*2;
if(pfiu+1<=lg_heap && heap[pfiu]>heap[pfiu+1])
pfiu++;
test=1;
}
if(test!=0){
heap[ppoz]=heap[pfiu];
elem[ppoz]=elem[pfiu];
poz_elem[elem[ppoz]]=ppoz;
elem[pfiu]=elem[lg_heap+1];
poz_elem[elem[pfiu]]=pfiu;
heap[pfiu]=heap[lg_heap+1];
ppoz=pfiu;
}
}while(test);
}
int main(){
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int op,num;
scanf("%d",&nr_op);
for(int i=1;i<=nr_op;i++){
scanf("%d",&op);
if(op==3)
printf("%d\n",heap[1]);
else{
scanf("%d",&num);
if(op==1){
++nr_elem;
add(lg_heap,num);
}
else
del(lg_heap,poz_elem[num],num);
}
}
return 0;
}