Pagini recente » Cod sursa (job #2839395) | Cod sursa (job #113700) | Cod sursa (job #337834) | Cod sursa (job #2886079) | Cod sursa (job #1443319)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 200001
FILE*fi,*fout;
typedef int Heap[MAXN];
Heap H;
int v[MAXN],vf[MAXN],nr,m;
inline int l_son(int nod){
return 2*nod;
}
inline int r_son(int nod){
return 2*nod+1;
}
inline int father(int nod){
return nod/2;
}
inline void coborare(int nod){
int k,aux;
while(nod){
k=nod;
if(l_son(k)<=nr&&v[H[l_son(k)]]<v[H[k]])
nod=l_son(k);
if(r_son(k)<=nr&&v[H[r_son(k)]]<v[H[nod]])
nod=r_son(k);
if(k==nod)
nod=0;
else{
aux=vf[H[k]];
vf[H[k]]=nod;
vf[H[nod]]=aux;
aux=H[nod];
H[nod]=H[k];
H[k]=aux;
}
}
}
inline void urcare(int nod){
int k,aux;
while(nod){
k=nod;
if(father(nod)>0){
if(v[H[nod]]<v[H[father(nod)]])
nod=father(nod);
aux=vf[H[k]];
vf[H[k]]=nod;
vf[H[nod]]=aux;
aux=H[nod];
H[nod]=H[k];
H[k]=aux;
}
if(k==nod)
nod=0;
}
}
inline void elimina(int nod){
vf[H[nod]]=-1;
H[nod]=H[nr];
vf[H[nr]]=nod;
nr--;
coborare(nod);
urcare(nod);
}
int main(){
int i,n,t,x,j;
fi=fopen("heapuri.in" ,"r");
fout=fopen("heapuri.out" ,"w");
fscanf(fi,"%d" ,&n);
nr=m=0;
for(i=0;i<n;i++){
fscanf(fi,"%d" ,&t);
if(t==1){
nr++;
m++;
fscanf(fi,"%d" ,&v[m]);
H[nr]=m;
vf[H[nr]]=nr;
urcare(nr);
}
if(t==2){
fscanf(fi,"%d" ,&x);
elimina(vf[x]);
}
if(t==3)
fprintf(fout,"%d\n" ,v[H[1]]);
}
fclose(fi);
fclose(fout);
return 0;
}