Cod sursa(job #572355)

Utilizator tinkyAndrei Ilisei tinky Data 5 aprilie 2011 11:26:22
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 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;	}
void jos(int k)
{
	int fiu;
	do
	{
		fiu =0;
		if (fiust(k)<=n)
			fiu=fiust(k);
		if (fiust(k)<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)
{
	int i;
	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);
	}
}

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