Cod sursa(job #303980)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 10 aprilie 2009 17:32:01
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <algorithm>
#define FIN "heapuri.in"
#define FOUT "heapuri.out"
#define MAX 200010
using namespace std;
int poz[MAX],heap[MAX],v[MAX];
int N,dheap;


void heap_up(int nod){

	int dad=nod/2;
	if (dad==0) return ;
	if (v[heap[dad]]>v[heap[nod]]){

		int aux=heap[dad];
		heap[dad]=heap[nod];
		heap[nod]=aux;
		poz[heap[dad]]=dad;
		poz[heap[nod]]=nod;
		heap_up(dad);
	}
}

void heap_dw(int nod){

	int st=nod*2,dr=st+1;
	int mini=nod;

	if (st<=dheap && v[heap[st]]<v[heap[mini]]) mini=st;
	if (dr<=dheap && v[heap[dr]]<v[heap[mini]]) mini=dr;

	if (mini!=nod){

		int aux=heap[nod];
		heap[nod]=heap[mini];
		heap[mini]=aux;
		poz[heap[nod]]=nod;
		poz[heap[mini]]=mini;
		heap_dw(mini);
	}
}

int main(void){

	freopen(FIN,"rt",stdin);
	freopen(FOUT,"wt",stdout);
	
	scanf("%d",&N);
	dheap=0;
	int nel=0;
	int x,y;
	for (int i=1;i<=N;++i){
		scanf("%d",&x);
		if (x==3){ printf("%d\n",v[heap[1]]);} else
		{
			scanf("%d",&y);
			if (x==1){
				++nel;
				v[nel]=y;
				heap[++dheap]=nel;
				poz[nel]=dheap;
				heap_up(dheap);
			} else {

				int aux=heap[poz[y]];
				heap[poz[y]]=heap[dheap];
				heap[dheap]=heap[poz[y]];
				poz[heap[poz[y]]]=poz[y];
				--dheap;
				heap_dw(poz[y]);
			}
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}