Cod sursa(job #280621)

Utilizator swift90Ionut Bogdanescu swift90 Data 13 martie 2009 14:51:58
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
#define N 200100
int heap[N],nr[1000100],ord[N],hp;
void upheap(int y,int poz){
	if(poz==1){
		heap[poz]=y;
		nr[y]=1;
		return;
	}
	if(heap[poz>>1]<y){
		heap[poz]=y;
		nr[y]=poz;
		return;
	}
	heap[poz]=heap[poz>>1];
	nr[heap[poz]]=poz;
	upheap(y,poz>>1);
}
void downheap(int x,int poz){
	int a=x,p=poz;
	if(a>heap[poz*2] && poz*2<=hp){
		a=heap[poz*2];
		p=poz<<1;
	}
	if(a>heap[poz*2+1] && poz*2+1<=hp){
		a=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(y,++hp);
		}
		if(x==2){
			scanf("%d",&y);
			a=heap[hp--];
			heap[nr[ord[y]]]=a;
			downheap(a,nr[ord[y]]);
			upheap(a,nr[a]);
			nr[ord[y]]=0;
		}
		if(x==3)
			printf("%d\n",heap[1]);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}