Cod sursa(job #1155742)

Utilizator iarbaCrestez Paul iarba Data 27 martie 2014 10:03:22
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
using namespace std;
int heap[1<<18+1],a[200002],ph[200002],caz,poz,t,n,i;
void change(int n1, int n2)
{
	int aux=ph[heap[n1]];
	ph[heap[n1]]=ph[heap[n2]];
	ph[heap[n2]]=aux;
	aux=heap[n1];
	heap[n1]=heap[n2];
	heap[n2]=aux;
}
void push(int nod)
{
	if(a[heap[nod/2]]>a[heap[nod]]){change(nod,nod/2);push(nod/2);}
}
void pop(int nod)
{
	if(a[heap[nod*2]]<a[heap[nod*2+1]]){change(nod,nod*2);pop(nod*2);return;}
	else{if(a[heap[nod*2+1]]!=999999){change(nod,nod*2+1);pop(nod*2+1);return;}}
	heap[nod]=200001;return;
}
int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%ld",&t);a[0]=-1;a[200001]=999999;
	for(i=1;i<=200000;i++){heap[i]=200001;}
	while(t--){
		scanf("%ld",&caz);
		if(caz==1){
			scanf("%ld",&a[++n]);
			heap[n]=n;ph[n]=n;
			push(n);
				  }
		if(caz==2){
			scanf("%ld",&poz);
			pop(ph[poz]);
				  }
		if(caz==3){
			printf("%ld\n",a[heap[1]]);
				  }
			  }
return 0;
}