Cod sursa(job #1755552)

Utilizator bogdanluncasubogdan bogdanluncasu Data 10 septembrie 2016 15:51:25
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
using namespace std;
int a[200001],x,lnod=1,order=1,n,index[200001],index2[200001];
void swap(int i,int j){int temp=a[j];a[j]=a[i];a[i]=temp;}
void swapIndex(int i,int j){int temp=index[j];index[j]=index[i];index[i]=temp;}
void swapIndex2(int i,int j){int temp=index2[j];index2[j]=index2[i];index2[i]=temp;}

void insert(){
	int nod=lnod;
	while(nod!=1&&a[nod/2]>a[nod]){
		swap(nod/2,nod);
		swapIndex(index2[nod/2],index2[nod]);
		swapIndex2(nod/2,nod);
		nod=nod/2;
	}
	lnod++;
}
void deleteIndex(int x){
	int nod=index[x];
		while(2*nod<lnod){
			//cout<<lnod<<" "<<nod<<endl;
			int nod2=a[2*nod]>a[2*nod+1]?2*nod+1:2*nod;
			if(2*nod+1==lnod)nod2=2*nod;
			swap(nod,nod2);
			index2[nod2]=nod;
			nod=nod2;
		}
		lnod--;
	
}
int main() {
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		switch(x){
			case 1:scanf("%d",&x);
			index[order]=lnod;
			index2[lnod]=order++;
			a[lnod]=x;
			insert();
			break;
			case 2:scanf("%d",&x);deleteIndex(x);break;
			case 3:printf("%d\n",a[1]);
		}
	}
}