Pagini recente » Cod sursa (job #1857860) | Cod sursa (job #2115818) | Cod sursa (job #884796) | Cod sursa (job #2901550) | Cod sursa (job #428155)
Cod sursa(job #428155)
#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<=n&&val[heap[w]]<val[heap[p]]) p=w;
w=(p<<1)+1;if(w<=n&&val[heap[w]]<val[heap[p]]) p=w;
swapH(q,p);
}
}
void insert(int k){
++n,++l;
val[l]=k;
heap[n]=l;
pos[l]=n;
upHeap(n);
}
void remove(int k){
val[k]=-1;
upHeap(pos[k]);
pos[heap[1]]=0;
heap[1]=heap[n--];
pos[heap[1]]=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;
}