Cod sursa(job #370743)

Utilizator titusuTitus C titusu Data 1 decembrie 2009 22:53:55
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
using namespace std;
#include <cstdio>
#include <cassert>
int heap[1<<18] , ordine[1<<18] , n,pozmax;

void Add(int valoare){
	heap[++n] = valoare ; ordine[++pozmax] = valoare;
	int esteHeap = 0, i = n , aux;
	while(i/2 && !esteHeap)
		if(heap[i]>= heap[i/2])
			esteHeap = 1;
		else{
			aux = heap[i]; heap[i] = heap[i/2] ; heap[i/2] = aux;
			i = i/2;
		}
}
void Delete(int indice){
	int aux , poz = 0;
	for(int i = 0; i<=n && !poz ; ++i)
		if(heap[i] == ordine[indice])
			poz = i;
	assert(poz>0);
	heap[poz] = heap[n--];
	int esteHeap = 0, i=poz, k;
	while(2*i<=n && !esteHeap)
	{
		k=2*i;
		if(k+1<=n && heap[k+1]<heap[k])
			k++;
		if(heap[i]<heap[k])
			esteHeap=1;
		else{
			aux=heap[i]; heap[i] = heap[k]; heap[k] = aux;
			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" , heap[1]);
		else{
			scanf("%d", &x);
			if(op==1)
				Add(x);
			else
				Delete(x);
		}
	}
	return 0;
}