Cod sursa(job #633286)

Utilizator cristicecCristian Uricec cristicec Data 13 noiembrie 2011 14:58:53
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
#define max 200100
using namespace std;
int heap[max], elem_poz[max], nr_ord[max];
int nr_operatii, nr_intr, lungime_heap;

void adauga(int elem){
	int aux;
	while(elem_poz[heap[elem]]<elem_poz[heap[elem/2]]){
		aux=heap[elem];
		heap[elem]=heap[elem/2];
		heap[elem/2]=aux;
		
		nr_ord[heap[elem]]=elem;
		nr_ord[heap[elem/2]]=elem/2;
		elem/=2;
	}
}

void scoate(int elem){
	int aux, s=0;
	while(elem!=s){
		s=elem;
		if(s*2<=lungime_heap && elem_poz[heap[elem]]>elem_poz[heap[s*2]]) elem=s*2;
		if(s*2+1<=lungime_heap && elem_poz[heap[elem]]>elem_poz[heap[s*2+1]]) elem=s*2+1;
		
		aux=heap[elem];
		heap[elem]=heap[s];
		heap[s]=aux;
		
		nr_ord[heap[elem]]=elem;
		nr_ord[heap[s]]=s;
	}
}


int main(){
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d", &nr_operatii);
	int operatie, elem, care_elem;
	for(int i=1;i<=nr_operatii;i++){
		scanf("%d", &operatie);
		if(operatie==1){
			
			scanf("%d", &elem);
			lungime_heap++;
			nr_intr++;
			elem_poz[nr_intr]=elem;
			heap[lungime_heap]=nr_intr;
			nr_ord[nr_intr]=lungime_heap;
		  
			adauga(lungime_heap);
			
		}
		
		else
			if(operatie==2){
				
				scanf("%d", &care_elem);
				elem_poz[care_elem]=-1;
				
				adauga(nr_ord[care_elem]);
				
				heap[1]=heap[lungime_heap--];
				nr_ord[heap[1]]=1;
				if(lungime_heap>1) scoate(1);
			}
			else
				if(operatie==3)
					printf("%d\n", elem_poz[heap[1]]);
				
	}
	return 0;
}