Cod sursa(job #303061)

Utilizator razyelxrazyelx razyelx Data 9 aprilie 2009 15:15:13
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#define MAXN 200001

FILE * fin = fopen("heapuri.in", "r");
FILE * fout= fopen("heapuri.out","w");

int v[MAXN], poz[MAXN], n, N;

int cauta(int x){
	for(int i=1;i<=N;++i)
		if(poz[i] == x) return i;
	return 0;
}
void adauga_in_heap(int x){
	int i,j,aux,x1,x2;
	v[++N] = x;
	poz[N] = N;
	i = N;
	while(i > 1)
		if(v[i] <= v[i/2]){ 
			aux = v[i]; v[i] = v[i/2]; v[i/2] = aux; 
			x1 = cauta(i);
			x2 = cauta(i/2);
			aux = poz[x1]; poz[x1] = poz[x2]; poz[x2] = aux;
			i/=2;}
		else i = 1;
}
void extract(int idx){
	int i,j,aux,x1,x2;
	v[poz[idx]] = v[N];
	N--;i = 1;
	
	while(i<=N)
		if(2*i <= N){
			j = 2*i;
			if(j+1<=N && v[j+1] <= v[j])j++;
			if(v[i] >= v[j]){
				aux = v[i]; v[i] = v[j]; v[j] = aux; 
				x1 = cauta(i);
				x2 = cauta(i/2);
				aux = poz[x1]; poz[x1] = poz[x2]; poz[x2] = aux;
				i = j;
			} else i = n+1;
		} else i = n+1;
}	
int main(){
	int val, op;
	fscanf(fin, "%d", &n);
	
	for(int i = 1;i<=n;++i){
		fscanf(fin,"%d", &op);
		
		if(op < 3){
			fscanf(fin,"%d", &val);
			if(op == 1) adauga_in_heap(val);
			if(op == 2) extract(val);
		} else 
			fprintf(fout, "%d\n", v[1]);
	}
	return 0;
}