Cod sursa(job #240068)

Utilizator maria_pparcalabescu maria daniela maria_p Data 6 ianuarie 2009 19:46:06
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<cstdio>
long h[200000],nr,n,l,x,y,a[200000],i;
long caut(long x){
	long i;
	for(i=0;i<n;i++)
		if(h[i]==x)return i;
	return -1;
}
void swap(long i, long j){
	long x;
	x=h[i];
	h[i]=h[j];
	h[j]=x;
}
void heapup(long k){
	long t;
	if(k<=0)return;
	t=(k-1)/2;
	if(h[k]<h[t]){
		swap(k,t);
		heapup(t);
	}
}
void heapdw(long k, long n){
	int st,dr,min;
	if(2*k+1<n){
		st=h[2*k+1];
		if(2*k+2<n)dr=h[2*k+1];
		else dr=st+1;
		if(st<dr)min=2*k+1;
		else min=2*k+2;
		if(h[k]>h[min]){
			swap(k,min);
			heapdw(min,n);
		}
	}
}
void cut(long x){
	long k,t;
	k=caut(x);
	h[k]=h[l-1];
	l--;
	t=(k-1)/2;
	if(h[k]<h[t])heapup(k);
	else heapdw(k,l);
}
int main(){
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%ld",&n);
	l=nr=0;
	for(i=0;i<n;i++){
		scanf("%ld",&x);
		if(x==3)printf("%ld\n",h[0]);
		else{
			scanf("%ld",&y);
			if(x==1){
				a[nr++]=y;
				h[l]=y;
				heapup(l);
				l++;
			}
			else
				cut(a[y-1]);
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}