Pagini recente » Cod sursa (job #1011517) | Cod sursa (job #1684711) | Rating beca victor gabriel (becav) | Cod sursa (job #2793004) | Cod sursa (job #488574)
Cod sursa(job #488574)
#include<stdio.h>
#include<stdlib.h>
void swap(int *a,int *b){
int t;
t = *a;
*a = *b;
*b = t;
}
void urca(int p,int *h,int *poz){
int t = p / 2;
while(t >= 1){
if(h[t] <= h[p])
break;
swap(&h[t],&h[p]);
p = t;
t = p / 2;
}
poz[h[t]] = t;
poz[h[p]] = p;
}
void coboara(int p,int n,int *h,int *poz){
int fs = 2 * p,fd = 2 * p + 1,pmin = p;
if(fs <= n && h[fs] < h[pmin])
pmin = fs;
if(fd <= n && h[fd] < h[pmin])
pmin = fd;
if(pmin != p){
swap(&h[p],&h[pmin]);
poz[h[p]] = p;
poz[h[pmin]] = pmin;
coboara(pmin,n,h,poz);
}
}
int main(){
FILE *f,*g;
f = fopen("heapuri.in","r");
g = fopen("heapuri.out","w");
int n,i,p,l = 0,x,j = 0;
fscanf(f,"%d",&n);
int *h = (int*)malloc((n + 1) * sizeof(int));
int *poz = (int*)malloc((n + 1) * sizeof(int));
int *ap = (int*)malloc((n + 1) * sizeof(int));
for(i = 0;i < n;i++){
fscanf(f,"%d",&p);
if(p == 1){
fscanf(f,"%d",&x);
h[++l] = x;
urca(l,h,poz);
ap[j++] = x;
}
else if(p == 2){
fscanf(f,"%d",&x);
swap(&h[poz[ap[x]]],&h[l]);
l--;
coboara(poz[ap[x]],l,h,poz);
}
else
fprintf(g,"%d\n",h[1]);
}
free(h);
free(poz);
free(ap);
fclose(f);
fclose(g);
return 0;
}