Pagini recente » Cod sursa (job #3030204) | Cod sursa (job #2533290) | Cod sursa (job #787872) | Cod sursa (job #2816499) | Cod sursa (job #428181)
Cod sursa(job #428181)
#include <cstdio>
#define MAX 200000
#define left_son(a) (a<<1)
#define right_son(a) ((a<<1)+1)
#define father(a) (a>>1)
int val[MAX],pos[MAX],heap[MAX],n=0,l=0;
inline void swap(int a,int b){
int c=heap[a];
heap[a]=heap[b];
heap[b]=c;
pos[heap[a]]=a;
pos[heap[b]]=b;
}
void upHeap(int x){
while(x/2&&val[heap[x]]<val[heap[father(x)]]){
swap(x,father(x));
x=father(x);
}
}
void downHeap(int x){
int y=0,w;
while(x!=y){
y=x;
if(left_son(y)<=l&&val[heap[x]]>val[heap[left_son(y)]]){
x=left_son(y);
}
if(right_son(y)<=l&&val[heap[x]]>val[heap[right_son(y)]]){
x=right_son(y);
}
swap(x,y);
}
}
FILE* fin=fopen("heapuri.in","r");
FILE* fout=fopen("heapuri.out","w");
int main(){
int numOp,op,x;
fscanf(fin,"%d ",&numOp);
for(int i=0;i<numOp;i++){
fscanf(fin,"%d ",&op);
switch(op){
case 1:
fscanf(fin,"%d ",&x);
l++,n++;
val[n]=x;
heap[l]=n;
pos[n]=l;
upHeap(l);
break;
case 2:
fscanf(fin,"%d ",&x);
val[x]=-1;
upHeap(pos[x]);
pos[heap[1]]=0;
heap[1]=heap[l--];
pos[heap[1]]=1;
if(l>1){
downHeap(1);
}
break;
case 3:
fprintf(fout,"%d\n",val[heap[1]]);
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}