Cod sursa(job #370752)

Utilizator titusuTitus C titusu Data 1 decembrie 2009 23:24:15
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
using namespace std;
#include <cstdio>
#include <cassert>
int heap[1<<18] , //heap[1] indicele din v al celui mei mic element
	v[1<<18] , //elementele in ordinea data
	poz[1<<18] , //poz[i] pozitia in heap a elementului introdus al i-lea
	n ,  // numarule de elemente din heap la momentul curent
	nrpoz; // numarul total de elemente introduse in heap, inclusiv cele sterse

void Add(int valoare){
	v[++nrpoz]=valoare;
	heap[++n] = nrpoz;
	poz[nrpoz] = n;
	int esteHeap = 0, i =n, aux;
	while(!esteHeap && i>1)
		if(v[heap[i/2]] < v[heap[i]])
			esteHeap = 1;
		else{
			aux= heap[i], heap[i] = heap[i/2], heap[i/2] = aux;
			poz[heap[i]] = i;
			poz[heap[i/2]] = i/2;
			i/=2;
		}
}
void Delete(int pozitie){
	int i = poz[pozitie], esteHeap=0, k, aux;
	heap[i] = heap[n--];
	poz[heap[i]] = i;
	while(!esteHeap && 2*i<=n){
		k=2*i;
		if(k+1<=n && v[heap[k]]>v[heap[k+1]])
			k++;
		if(v[heap[i]] <v[heap[k]])
			esteHeap = 1;
		else{
			aux=heap[i], heap[i] = heap[k], heap[k] =aux;
			poz[heap[i]] = i;
			poz[heap[k]] = k;
			i=k;
		}
	}
}

int main(){
	int nrop,op,x;
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d",&nrop);
	for( ; nrop ; --nrop){
		scanf("%d", &op);
		if(op == 3)
			printf("%d\n" , v[heap[1]]);
		else{
			scanf("%d", &x);
			if(op==1)
				Add(x);
			else
				Delete(x);
		}
	}
	return 0;
}