Pagini recente » Cod sursa (job #2906941) | Cod sursa (job #134997) | Cod sursa (job #2274135) | Cod sursa (job #1723172) | Cod sursa (job #632188)
Cod sursa(job #632188)
//min heap
#include <stdio.h>
#define MAXN 200005
int heap[MAXN];
int poz[MAXN],v[MAXN];//poz[i]=locul in heap pe care se afla al i-lea element introdus
int N=0;
void urca(int loc){
int x;
int aux;
while((x=loc/2) && v[heap[loc]]<v[heap[x]]){
//interschimb nodul de pe locul loc cu tatal sau
poz[heap[x]]=loc;
poz[heap[loc]]=x;
aux=heap[loc];
heap[loc]=heap[x];
heap[x]=aux;
loc=x;
}
}
void coboara(int loc){
//cobor in fiul cel mai mic dintre cei doi
int x,min,fiu;
int aux;
do{
fiu=0;
if((x=(loc*2))<=N){
fiu=x;
min=v[heap[fiu]];
}else return;
x++;
if(x<=N && (min>v[heap[x]])){
min=v[heap[x]];
fiu=x;
}
if(fiu){
if(v[heap[loc]]>min){
//interschimb loc cu fiu
poz[heap[fiu]]=loc;
poz[heap[loc]]=fiu;
aux=heap[loc];
heap[loc]=heap[fiu];
heap[fiu]=aux;
loc=fiu;
}else fiu=0;//daca mai are fii, dar sunt toti mai mari, e ok
}
}while(fiu);
}
int main(){
freopen ("heapuri.in","r",stdin);
freopen ("heapuri.out","w",stdout);
int n,cod,x,crono=1;
int aux;
scanf("%d",&n);
int i;
for(i=0;i<n;i++){
scanf("%d",&cod);
if(cod==1){
//inserez
scanf("%d",&x);
v[crono]=x;
heap[++N]=crono;
poz[crono]=N;
crono++;
urca(N);
/*printf("inserez %d\n",x);
printf("heapul: ");
for(int j=1;j<=N;j++)printf("(%d,%d)",heap[j].nr,heap[j].crono);
printf("\n");*/
}
if(cod==2){
//sterg al x-lea element ca ordine cronologica....
scanf("%d",&x);
//el se afla in heap pe locul poz[x];
//printf("scot elementul %d %d\n",heap[poz[x]].nr,heap[poz[x]].crono);
heap[poz[x]]=heap[N];
N--;
if(poz[x]>1 && v[heap[poz[x]]]<v[heap[poz[x]/2]])urca(poz[x]);
else if(poz[x]<N && v[heap[poz[x]]]>v[heap[poz[x]/2]])coboara(poz[x]);
/*printf("heapul: ");
for(int j=1;j<=N;j++)printf("(%d,%d)",heap[j].nr,heap[j].crono);
printf("\n");*/
//poz[x]=0;//marchez ca acest nod nu mai e in heap...
}
if(cod==3){
//afisez minimul
printf("%d\n",v[heap[1]]);
}
}
return 0;
}