Pagini recente » Cod sursa (job #642677) | Profil Opportunity | Cod sursa (job #1841744) | Cod sursa (job #2758604) | Cod sursa (job #1621965)
#include <stdio.h>
#define lim 200000
int v[lim],poz[lim],heap[lim],n;
inline int dad(int p){
return (p-1)/2;
}
inline int sonst(int p){
return 2*p+1;
}
inline int sondr(int p){
return 2*p+2;
}
inline void swap(int p,int q){
int aux;
aux=heap[p];
heap[p]=heap[q];
heap[q]=aux;
poz[heap[p]]=p;
poz[heap[q]]=q;
}
inline void up(int p){
while(p>0&&v[heap[dad(p)]]>v[heap[p]]){
swap(p,dad(p));
p=dad(p);
}
}
inline void insert(int i){
heap[n]=i;
poz[i]=n;
n++;
up(n-1);
}
inline void down(int p){
int q,pp=1;
while(pp!=0&&sonst(p)<n){
q=sonst(p);
if(sondr(p)<n&&v[heap[sondr(p)]]<v[heap[q]])
q=sondr(p);
if(v[heap[q]]<v[heap[p]]){
swap(p,q);
p=q;
}
else
pp=0;
}
}
inline void erase(int p){
n--;
swap(n,p);
if(p!=0&&v[heap[p]]<v[heap[dad(p)]])
up(p);
else
down(p);
}
int main(){
FILE *fin,*fout;
fin=fopen("heapuri.in","r");
fout=fopen("heapuri.out","w");
int i,x,op,cer;
fscanf(fin,"%d",&op);
for(i=0;i<op;i++){
fscanf(fin,"%d",&cer);
if(cer==1){
fscanf(fin,"%d",&v[i]);
insert(i);
}
if(cer==2){
fscanf(fin,"%d",&x);
erase(poz[x-1]);
}
if(cer==3)
fprintf(fout,"%d\n",v[heap[0]]);
}
fclose(fin);
fclose(fout);
return 0;
}