Pagini recente » Cod sursa (job #498906) | Cod sursa (job #365898) | Cod sursa (job #2277809) | Cod sursa (job #2967089) | Cod sursa (job #1258754)
#include<stdio.h>
#define N 200000
int v[N],poz[N],heap[N];
inline int left(int i){
return i*2+1;
}
inline int right(int i){
return i*2+2;
}
inline int parent(int i){
if(i!=0)
return (i-1)/2;
return -1;
}
inline void swap(int i,int j){
int aux=heap[i];
heap[i]=heap[j];
heap[j]=aux;
poz[heap[i]]=i;
poz[heap[j]]=j;
}
void insert(int i){
while(parent(i)!=-1&&v[heap[parent(i)]]>=v[heap[i]]){
swap(i,parent(i));
i=parent(i);
}
}
void pop(int x,int hSize){
int y=-1;
while(x!=y){
y=x;
if(left(x)<hSize&&v[heap[x]]>v[heap[left(x)]])
x=left(x);
if(right(x)<hSize&&v[heap[x]]>v[heap[right(x)]])
x=right(x);
swap(x,y);
}
}
int main(){
FILE *fin,*fout;
fin=fopen("heapuri.in","r");
fout=fopen("heapuri.out","w");
int n;
fscanf(fin,"%d",&n);
int i,nr=0,length=0;
for(i=0;i<n;i++){
int op,x;
fscanf(fin,"%d",&op);
if(op==1){
fscanf(fin,"%d",&v[nr]);
heap[length]=nr;
poz[nr++]=length++;
insert(length-1);
}
else if(op==2){
fscanf(fin,"%d",&x);
v[x-1]=-1;
insert(poz[x-1]);
poz[heap[0]]=-1;
heap[0]=heap[--length];
poz[heap[0]]=0;
if(length>=1)
pop(0,length);
}
else
fprintf(fout,"%d\n",v[heap[0]]);
}
return 0;
}