Pagini recente » Cod sursa (job #1110409) | Cod sursa (job #1862113) | Cod sursa (job #1676737) | Cod sursa (job #1782426) | Cod sursa (job #2503745)
#include <stdio.h>
using namespace std;
FILE *in,*out;
int heap[200002],pos[200002],order[200002];
int n,nr,hm;
void sift(int k){
int key=heap[k],pey=order[k],son;
do{
son=0;
if(k*2<=nr && key>heap[k*2])
son=k*2;
if(k*2+1<=nr && heap[k*2]>heap[k*2+1] && key>heap[k*2+1])
son=k*2+1;
if(son && key>heap[son]){
heap[k]=heap[son];
order[k]=order[son];
pos[order[son]]=k;
k=son;
}
}while(son);
heap[k]=key;
order[k]=pey;
pos[order[k]]=k;
}
void percolate(int k){
int key=heap[k],pey=order[k];
while(k>1 && key<heap[k/2]){
heap[k]=heap[k/2];
pos[order[k/2]]=k;
order[k]=order[k/2];
k=k/2;
}
heap[k]=key;
order[k]=pey;
pos[order[k]]=k;
}
void insert_heap(int node){
heap[++nr]=node;
hm++;
pos[hm]=nr;//pozitia elemntului intrat al hm-lea
order[nr]=hm;//elementul de pe pozitia nr a intrat al hm-lea
percolate(nr);
}
void cut(int x){
heap[pos[x]]=heap[nr];
pos[order[nr]]=pos[x];
order[pos[x]]=order[nr];
nr--;
percolate(pos[x]);
sift(pos[x]);
}
void read(){
int code,node,x;
fscanf(in,"%d",&n);
for(int i=0;i<n;i++){
fscanf(in,"%d",&code);
if(code==1)
fscanf(in,"%d",&node),insert_heap(node);
else if(code==2)
fscanf(in,"%d",&x),cut(x);
else
fprintf(out,"%d\n",heap[1]);
}
}
int main(){
in=fopen("heapuri.in","r");
out=fopen("heapuri.out","w");
read();
/*fprintf(out,"\n");
int j=1,m=1,p2=1;
for(int i=1;i<=50;i++,p2*=2,fprintf(out,"\n"))
for(m=1,j;j<=nr && m<=p2;j++,m++)
fprintf(out,"%d ",heap[j]);*/
return 0;
}