Cod sursa(job #407288)

Utilizator dexter_dexMutascu Adrian - Dragos dexter_dex Data 2 martie 2010 10:54:30
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>

#define Nmax 200005

int H[Nmax], poz[Nmax], v[Nmax];
int n, N, q, x, i, niv;

void swap(int i, int j){
	
	int aux;
	
	poz[H[i]] = j;
	poz[H[j]] = i;
	
	aux = H[i];
	H[i] = H[j];
	H[j] = aux;
	
}

int fiu_min(int i){
	
	if (2*i+1<= niv) 
		if (v[H[2*i+1]] < v[H[2*i]])
			return 2*i+1;
	
	return 2*i;
}

void down (int i){
	
	int k;
	
	if (i <= niv/2){
		k = fiu_min(i);
		if (v[H[i]] > v[H[k]]){
			swap(i, k);
			down(k);
		}
		
	}
	
	
}

void up (int i){
	
	int t = i/2;	
	
	if (i > 1 && v[H[i]] < v[H[t]]){
		swap(i,t);
		up(t);
	}
}

void push(int valoare){
	v[++N] = valoare;
	H[++niv] = N;
	poz[N] = niv;
	up(niv);
}

void pop(int i){
	swap (i,niv);
	niv--;
	down(i);
}

int main (){
	
	FILE * f = fopen ("heapuri.in", "r");
	FILE * g = fopen ("heapuri.out", "w");
	
	fscanf(f, "%d", &n);
	for (i = 1 ; i <= n ; i++){
		fscanf(f, "%d", &q);
		if (q == 1) {
			fscanf (f, "%d", &x);
			push(x);
		}
		
		if (q == 2) {
			fscanf (f, "%d", &x);
			pop(poz[x]);
		}
		
		if (q == 3){
			fprintf(g, "%d\n", v[H[1]]);
		}
	}
	
	fclose(f);
	fclose(g);
	return 0;
}