Pagini recente » Cod sursa (job #2581778) | Cod sursa (job #1327651) | Cod sursa (job #1254318) | Cod sursa (job #745793) | Cod sursa (job #2503705)
#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])
son=k*2+1;
}
if(son){
heap[k]=heap[son];
order[k]=order[son];
pos[order[k]]=k;
heap[son]=key;
order[son]=pey;
pos[order[son]]=son;
}
}while(son);
}
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];
order[pos[x]]=order[nr];
pos[order[nr]]=x;
nr--;
if(pos[x]>1 && heap[pos[x]]<heap[pos[x]]/2)
percolate(pos[x]);
else
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<=3;i++,p2*=2,fprintf(out,"\n"))
for(m=1,j;j<=nr && m<=p2;j++,m++)
fprintf(out,"%d ",heap[j]);
*/
return 0;
}