Cod sursa(job #820401)

Utilizator cristi_berceanuFMI - Cristi Berceanu cristi_berceanu Data 20 noiembrie 2012 19:54:32
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<cstdio>
#include<algorithm>

#define max 200020
using namespace std;

int N,l,nr;
int v[max],h[max],pos[max];

inline int tata(int i)
{
return i/2;
}

inline int fiu_stanga(int i)
{
return 2*i;
}

inline int fiu_dreapta(int i)
{
return 2*i+1;
}

void schimba(int i, int j)
{
int aux;
aux=h[i];
h[i]=h[j];
h[j]=aux;
pos[h[i]]=i;
pos[h[j]]=j;
}

void urca(int i)
{
if(tata(i)>0&&v[h[i]]<v[h[tata(i)]])
{
	schimba(i,tata(i));
	urca(tata(i));
}
}

void coboara(int i)
{
int st=fiu_stanga(i),dr=fiu_dreapta(i),b=i;
if(st<=nr&&v[h[st]]<v[h[b]]) b=st;
if(dr<=nr&&v[h[dr]]<v[h[b]]) b=dr;
	if(b!=i)
	{
		schimba(i,b);
		coboara(b);
	}
}
int main()
{
int i,n,cod,a,p,nv=0;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
for(i=0;i<n;i++)
{
	scanf("%d",&cod);
	
	if(cod==1)
	{
		scanf("%d",&a);
		v[++nv]=a;
		h[++nr]=nv;
		pos[nv]=nr;
		urca(nr);
	}
	if(cod==2)
	{
	scanf("%d",&a);
	p=pos[a];
	h[p]=h[nr--];
	pos[h[p]]=p;
	urca(p);
	coboara(p);	
	}
	if(cod==3) printf("%d\n",v[h[1]]);
}
return 0;
}