Cod sursa(job #431863)

Utilizator forever_yangGroza Marius-Cristian forever_yang Data 1 aprilie 2010 15:23:42
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<fstream>
using namespace std;
int n=0,h[200000],c[200000],nc=0,nn,p[100000000],i,nr;
void upheap(int poz,int nr)
{int aux;
	while(poz>1&&h[poz]<h[poz/2])
	{
		h[poz]=h[poz/2];
		h[poz/2]=nr;
		aux=p[h[poz]];
		p[h[poz]]=p[h[poz/2]];
		p[h[poz/2]]=aux;
		
	poz=poz/2;
	}
	

}

void downheap(int poz,int nr)
{int son,aux;
	do
		{son=0;
			if(poz*2<n&&poz*2+1<=n)
				if(h[poz*2]<h[poz*2+1])
					{
						h[poz]=h[poz*2];
						h[poz*2]=nr;
							aux=p[h[poz]];
							p[h[poz]]=p[h[poz*2]];
							p[h[poz*2]]=aux;
					}
				else
					{
						h[poz]=h[poz*2+1];
						h[poz*2+1]=nr;
							aux=p[h[poz]];
							p[h[poz]]=p[h[poz*2+1]];
							p[h[poz*2+1]]=aux;
					}
	
			if(poz*2<=n&&poz*2+1>n)	
				{
					h[poz]=h[poz*2];
						h[poz*2]=nr;
							aux=p[h[poz]];
							p[h[poz]]=p[h[poz*2]];
							p[h[poz*2]]=aux;
				}
	
			
		}
	while(son);
	
	
	
	
}








int main()
{

ifstream f("heapuri.in");
ofstream g("heapuri.out");
f>>nn;
for(i=1;i<=nn;i++)
{f>>nr;
if(nr==1)
	{f>>nr;
	nc++;
	n++;
	h[n]=nr;
	c[nc]=nr;
	p[nr]=n;
	upheap(n,nr);
	}
else
if(nr==2)
	{
		f>>nr;
		h[p[c[nr]]]=h[n];
		p[h[n]]=p[c[nr]];
		n--;
		if(h[p[c[nr]]/2]>h[p[c[nr]]])
			upheap(p[c[nr]],h[p[c[nr]]]);
		else
			downheap(p[c[nr]],h[p[c[nr]]]);
		
		
		
	}	
else
	if(nr==3)
		g<<h[1]<<"\n";
	
	
}








return 0;
}