Cod sursa(job #235762)

Utilizator blasterzMircea Dima blasterz Data 25 decembrie 2008 19:46:52
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#include <string>
#define N 200001
#define L ((i)<<1)
#define R (L+1)
#define T ((i)>>1)

int H[N], poz[N],pos[N];
int nh;

inline void swap(int i, int j)
{
	int t=H[i];
	H[i]=H[j];
	H[j]=t;
	
	t=poz[i];
	poz[i]=poz[j];
	poz[j]=t;
	pos[poz[i]]=i;
	pos[poz[j]]=j;
}

inline void upheap(int i)
{
	if(i<=1) return;
	if(H[i] < H[T]) swap(i, T), upheap(T);
}

inline void downheap(int i)
{
	int m=i;
	if(L<=nh) if(H[L] < H[m]) m=L;
	if(R<=nh) if(H[R] < H[m]) m=R;
	
	if(m!=i) swap(i, m), downheap(m);
}

#define dim 8192
char ax[dim];
int pz;

inline void cit(int &x)
{
	x=0;
	while(ax[pz]<'0' || ax[pz]>'9')
		if(++pz==dim)fread(ax,1,dim,stdin),pz=0;
	
	while(ax[pz]>='0' && ax[pz]<='9')
	{
		x=x*10+ax[pz]-'0';
		if(++pz==dim)fread(ax,1,dim,stdin),pz=0;
	}
}

int main()
{
	freopen("heapuri.in","r",stdin);
	int n,i,p,q;
	int nr_insert=0;
	cit(n);
	
	while(n--)
	{
		cit(p);
		if(p!=3) cit(q);
		/*
		
		for(i=1;i<=nh;++i) printf("%d ", H[i]);
		printf("\n");
		for(i=1;i<=nh;++i) printf("%d ", poz[i]);
		printf("\n");
		for(i=1;i<=nr_insert;++i)printf("%d ", pos[i]);
		*/
		//printf("%d %d++ %d %d\n", p,q,pos[q],nh);
		if(p == 1)
		{
			H[++nh]=q;
			poz[nh]=++nr_insert;
			pos[poz[nh]]=nh;
			upheap(nh);
			
		}	
		if(p == 2)
		{
		//	swap(pos[q], 1);
			int px=pos[q];
			swap(px, nh--);
			
			downheap(px);
			
		}
			
			
		if(p == 3)
		{
			printf("%d\n", H[1]);
			
		}
		
		
	}
	return 0;
}