Cod sursa(job #637994)

Utilizator DaicuDaicu Alexandru Daicu Data 20 noiembrie 2011 18:04:05
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#define nmax 200020
int heap[nmax],poz_elem[nmax],elem[nmax],nr_op,lg_heap,nr_elem;

void add(int &lg_heap,int num){
	++lg_heap;
	int ppoz=lg_heap;
	while(ppoz>1 && num<heap[ppoz/2]){
		heap[ppoz]=heap[ppoz/2];
		elem[ppoz]=elem[ppoz/2];
		poz_elem[elem[ppoz]]=ppoz;
		ppoz=ppoz/2;
	}
	heap[ppoz]=num;
	elem[ppoz]=nr_elem;
	poz_elem[elem[ppoz]]=ppoz;
}

void del(int &lg_heap,int ppoz,int num){
	heap[ppoz]=heap[lg_heap];
	elem[ppoz]=elem[lg_heap];
	poz_elem[elem[ppoz]]=ppoz;
	lg_heap--;
	int test,pfiu;
	do{
		test=0;
	if(ppoz*2<=lg_heap){
		pfiu=ppoz*2;
		if(pfiu+1<=lg_heap && heap[pfiu]>heap[pfiu+1])
			pfiu++;
		test=1;
	}
	if(test!=0){
		heap[ppoz]=heap[pfiu];
		elem[ppoz]=elem[pfiu];
		poz_elem[elem[ppoz]]=ppoz;
		elem[pfiu]=elem[lg_heap+1];
		poz_elem[elem[pfiu]]=pfiu;
	  heap[pfiu]=heap[lg_heap+1];
		ppoz=pfiu;
	}
	}while(test);
}
	
int main(){
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	int op,num;
	scanf("%d",&nr_op);
	for(int i=1;i<=nr_op;i++){
		scanf("%d",&op);
		if(op==3)
			printf("%d\n",heap[1]);
		else{
			scanf("%d",&num);
			if(op==1){
				++nr_elem;
				add(lg_heap,num);
			}
			else
				del(lg_heap,poz_elem[num],num);
		}
	}
	return 0;
}