Cod sursa(job #1755546)

Utilizator bogdanluncasubogdan bogdanluncasu Data 10 septembrie 2016 15:33:18
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
using namespace std;
int a[200001],x,lnod=1,order=1,n,index[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 insert(int x){
	int nod;
	index[order++]=lnod;
	if(lnod==1){
		a[1]=x;lnod++;
	}else{
		nod=lnod;
		a[nod]=x;
		while(nod!=1){
			if(a[nod/2]>a[nod]){
				swap(nod/2,nod);
				swapIndex(nod/2,nod);
				nod=nod/2;
			}else nod=1;
		}
		lnod++;
	}
}
void deleteIndex(int x){
	int nod;
	for(int i=1;i<lnod;i++)
		if(index[i]==x){nod=i;break;}
	while(2*nod<lnod){
		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);
		index[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);insert(x);break;
			case 2:scanf("%d",&x);deleteIndex(x);break;
			case 3:printf("%d\n",a[1]);
		}
	}
}