Cod sursa(job #488574)

Utilizator edward_alexStanciu Alexandru Marian edward_alex Data 29 septembrie 2010 13:29:22
Problema Heapuri Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.25 kb
#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;
}