Cod sursa(job #396557)

Utilizator bog29Antohi Bogdan bog29 Data 15 februarie 2010 16:13:05
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<fstream>
#define dmax 200004
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
long long n,x[dmax],h[dmax],l;

int left_son(int k)
{	return 2*k;
}
int right_son(int k)
{	return 2*k+1;
}
int father(int k)
{	return k/2;
}

void urca(int k)
{	int z,v;
	v=h[k];
	z=k;
	while(h[father(z)]>v && z)
	{	h[z]=h[father(z)];
		z=father(z);
	}
	h[z]=v;
}	

void coboara(int k,int d)
{	int z,t,f;
	z=k;
	do{	f=0;
		if(left_son(z)<=d)
			f=left_son(z);
		else f=0;
		if(right_son(z)<=d)
			if(h[right_son(z)]<h[f])
				f=right_son(z);
		if(h[f]<h[z] && f)
		{	t=h[z];
			h[z]=h[f];
			h[f]=t;
			z=f;
		}	
	}while(f);	
}

void add(long long k)
{	l++;
	h[l]=k;
	urca(l);
}
void remove(long long k)
{	int i;
	for(i=1;i<=l;i++)
		if(h[i]==x[k])
		{	h[i]=h[l];
			l--;
			coboara(i,l);
		}
}

int main()
{	long long i,op,nr,j,crt=0;
	in>>n;
	for(i=1;i<=n;i++)
	{	in>>op;
		if(op!=3)
		{	in>>nr;
			if(op==1)
			{	add(nr);
				crt++;
				x[crt]=nr;
			}	
			if(op==2)
				remove(nr);
		}
		else out<<h[1]<<'\n';
	}
	in.close();
	return 0;
}