Pagini recente » Cod sursa (job #327108) | Cod sursa (job #3199326) | Cod sursa (job #2405627) | Cod sursa (job #2453439) | Cod sursa (job #428167)
Cod sursa(job #428167)
#include <iostream>
#define MAX 200000
int val[MAX],pos[MAX],heap[MAX],n,l;
void swapH(int a,int b){
int aux=heap[a];
heap[a]=heap[b];
heap[b]=aux;
pos[heap[a]]=a;
pos[heap[b]]=b;
}
void upHeap(int k){
while(k>>1&&val[heap[k>>1]]>val[heap[k]]){
swapH(k,k>>1);
k>>=1;
}
}
void downHeap(int p){
int q=0,w;
while(q!=p){
q=p;
w=p<<1; if(w<=l&&val[heap[w]]<val[heap[p]]) p=w;
w=(p<<1)+1;if(w<=l&&val[heap[w]]<val[heap[p]]) p=w;
swapH(q,p);
}
}
void insert(int k){
++n,++l;
val[n]=k;
pos[n]=l;
heap[l]=n;
upHeap(l);
}
void remove(int x){
val[x]=-1;
upHeap(pos[x]);
pos[heap[1]]=0;
heap[1]=heap[l--];
pos[heap[1]]=1;
if(l>1){
downHeap(1);
}
}
FILE* fin=fopen("heapuri.in","r");
FILE* fout=fopen("heapuri.out","w");
int main(){
int numOp,op,m;
fscanf(fin,"%d ",&numOp);
while(numOp--){
fscanf(fin,"%d ",&op);
switch(op){
case 1:
fscanf(fin,"%d ",&m);
insert(m);
break;
case 2:
fscanf(fin,"%d ",&m);
remove(m);
break;
case 3:
fprintf(fout,"%d\n",val[heap[1]]);
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}