Cod sursa(job #488820)

Utilizator edward_alexStanciu Alexandru Marian edward_alex Data 30 septembrie 2010 08:47:09
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 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 *ap){
    int t = p / 2;
    while(t >= 1){
		if(ap[h[t]] <= ap[h[p]])
			break;
		swap(&h[t],&h[p]);
		poz[h[t]] = t;
		poz[h[p]] = p;
		p = t;
		t = p / 2;
    }
}

void coboara(int p,int n,int *h,int *poz,int *ap){
    int fs = 2 * p,fd = 2 * p + 1,pmin = p;
    if(fs <= n && ap[h[fs]] < ap[h[pmin]])
		pmin = fs;
    if(fd <= n && ap[h[fd]] < ap[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,ap);
    }
}

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));
	//int *v = (int*)malloc((n + 1) * sizeof(int));
    for(i = 1;i <= n;i++){
		fscanf(f,"%d",&p);
		if(p == 1){
			fscanf(f,"%d",&x);
			ap[++j] = x;
			h[++l] = j;
			poz[j] = l;
			urca(l,h,poz,ap);
		}
		else if(p == 2){
			fscanf(f,"%d",&x);
			poz[h[l]] = poz[x];
			swap(&h[poz[x]],&h[l]);
			l--;
			urca(poz[x],h,poz,ap);
			coboara(poz[x],l,h,poz,ap);
		}
		else
			fprintf(g,"%d\n",ap[h[1]]);
	}
	/*
    for(i = 1;i <= j;i++)
		printf("%d ",ap[i]);
	printf("\n");
	*/
    free(h);
    free(poz);
    free(ap);
    fclose(f);
    fclose(g);
    return 0;
}