Cod sursa(job #280708)

Utilizator swift90Ionut Bogdanescu swift90 Data 13 martie 2009 15:30:10
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#define N 200100
int heap[N],nr[N],ord[N],hp;
void upheap(int y,int poz){
	if(poz==1){
		heap[poz]=y;
		nr[y]=1;
		return;
	}
	if(ord[heap[poz>>1]]<ord[y]){
		heap[poz]=y;
		nr[ord[y]]=poz;
		return;
	}
	heap[poz]=heap[poz>>1];
	nr[heap[poz]]=poz;
	upheap(y,poz>>1);
}
void downheap(int x,int poz){
	int a=ord[x],p=poz;
	if(a>ord[heap[poz*2]] && poz*2<=hp){
		a=ord[heap[poz*2]];
		p=poz<<1;
	}
	if(a>ord[heap[poz*2+1]] && poz*2+1<=hp){
		a=ord[heap[poz*2+1]];
		p=poz*2+1;
	}
	if(p!=poz){
		heap[poz]=heap[p];
		nr[heap[poz]]=poz;
	}
	else{
		heap[poz]=x;
		nr[heap[poz]]=poz;
		return;
	}
	downheap(x,p);
}
int main(){
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	int i,n,x,y,a;
	scanf("%d",&n);
	for(i=0;i<n;++i){
		scanf("%d",&x);
		if(x==1){
			scanf("%d",&y);
			ord[++ord[0]]=y;
			upheap(ord[0],++hp);
		}
		if(x==2){
			scanf("%d",&y);
			a=heap[hp];
			heap[hp--]=0;
			heap[nr[y]]=a;
			downheap(a,nr[y]);
			upheap(a,nr[a]);
			nr[y]=0;
		}
		if(x==3)
			printf("%d\n",ord[heap[1]]);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}