Cod sursa(job #572835)

Utilizator tinkyAndrei Ilisei tinky Data 5 aprilie 2011 17:44:33
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#define nmax 200010
using namespace std;
int h[nmax],v[nmax],a[nmax];
int n;
int fiust(int nod){	return 2*nod;	}
int fiudr(int nod){	return 2*nod+1;	}
int tata (int nod){	return nod/2;	}
ofstream out("heapuri.out");
void jos(int k)
{
	int fiu;
	do
	{
		fiu =0;
		if (fiust(k)<=n)
			fiu=fiust(k);
		if (h[fiust(k)]>h[fiudr(k)]&&fiudr(k)<=n)
			fiu=fiudr(k);
		if (h[fiu]>=h[k])
			fiu=0;
		else if (fiu)
		{
			swap(h[fiu],h[k]);
			swap(v[a[fiu]],v[a[k]]);
			swap(a[fiu],a[k]);
			k=fiu;
		}
	}while (fiu);
}
void sus(int k)
{
	while (k>1&&h[k]<h[tata(k)])
	{
		swap(h[k],h[tata(k)]);
		swap(v[a[k]],v[a[tata(k)]]);
		swap(a[k],a[tata(k)]);
		k=tata(k);
	}
}
void afis()
{
	int i;
	for (i=1;i<=n;i++)
		out<<h[i]<<' ';
	out<<'\n';
	for (i=1;i<=n;i++)
		out<<v[i]<<" ";
	out<<'\n';
	for (i=1;i<=n;i++)
		out<<a[i]<<" ";
	out<<"\n\n";
}

	
int main()
{
	int op,m,x,l=0,j;
	ifstream in("heapuri.in");
	
	in>>m;
	for (j=1;j<=m;j++)
	{
		in>>op;
		if (op<3)
		{
			in>>x;
			if (op==1)
			{
				n++;
				l++;
				v[l]=n;
				a[n]=l;
				h[n]=x;
				sus(n);
			}
			else if (op==2)
			{
				h[v[x]]=h[n];
				a[v[x]]=a[n];
				v[a[n]]=v[x];
				n--;
				if (h[v[x]]<h[tata(v[x])])
					sus(v[x]);
				else
					jos(v[x]);
			}
		}
		else
		{
			out<<h[1]<<'\n';
			//afis();
		}
	}
}