Cod sursa(job #552479)

Utilizator NemultumituMatei Ionita Nemultumitu Data 12 martie 2011 13:46:41
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#define N 200000

int n, nr, p;
int heap[2*N], v[N], u[N];

void swap (int &a, int &b)
{
	a=a+b;
	b=a-b;
	a=a-b;
}

void baga (int x)
{
	heap[p]=x;
	int i=p;
	while (heap[i]<heap[i/2])
	{
		swap (heap[i], heap[i/2]);
		swap (v[u[i]], v[u[i/2]]);
		swap (u[i], u[i/2]);
		i/=2;
	}
}

void scoate (int poz)
{
	swap (heap[poz], heap[p]);
	swap (v[u[poz]], v[u[p]]);
	swap (u[poz], u[p]);
	heap[p--]=0;
	if (poz==p+1)
		return;
	int i=poz;
	while (heap[i]<heap[i/2])
	{
		swap (heap[i], heap[i/2]);
		swap (v[u[i]], v[u[i/2]]);
		swap (u[i], u[i/2]);
		i/=2;
	}
	while ((heap[i]>heap[2*i]&&2*i<=p)||(heap[i]>heap[2*i+1]&&2*i+1<=p))
		if (heap[i]>heap[2*i]&&2*i<=p)
		{
			swap (heap[i], heap[i*2]);
			swap (v[u[i]], v[u[i*2]]);
			swap (u[i], u[i*2]);
			i*=2;
		}
		else
		{
			swap (heap[i], heap[i*2+1]);
			swap (v[u[i]], v[u[i*2+1]]);
			swap (u[i], u[i*2+1]);
			i=2*i+1;
		}	
}

void read()
{
	freopen ("heapuri.in","r",stdin);
	freopen ("heapuri.out","w",stdout);
	scanf ("%d",&n);
	int cod, x;
	while (n--)
	{
		scanf ("%d", &cod);
		if (cod==1)
		{
			scanf ("%d",&x);
			v[++nr]=++p;
			u[p]=nr;
			baga(x);
		}
		if (cod==2)
		{
			scanf ("%d", &x);
			scoate (v[x]);
		}
		if (cod==3)
			printf ("%d\n", heap[1]);
	}
}

int main()
{
	read();
	return 0;
}