Cod sursa(job #524153)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 20 ianuarie 2011 13:41:43
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<algorithm>
using namespace std;

#define N_MAX 200005

int dimHeap;
int heap[N_MAX],poz[N_MAX];

int a[N_MAX];
int n,i,j,N;
int op,x;

void upHeap(int x)
{
	while(1<x&&a[ heap[x>>2] ]>a[ heap[x] ])
	{
		swap(poz[ heap[x>>2] ],poz[ heap[x] ]);
		swap(heap[x>>2],heap[x]);
		x=x>>2;
	}
}

void downHeap(int x)
{
	int st=x<<2;
	int dr=(x<<2)+1;
	int minim=x;

	if(st<=dimHeap&&a[ heap[st] ]<a[ heap[minim] ])
		minim=st;
	if(dr<=dimHeap&&a[ heap[dr] ]<a[ heap[minim] ])
		minim=dr;

	if(minim!=x)
	{
		swap(poz[ heap[x] ],poz[ heap[minim] ]);
		swap(heap[x],heap[minim]);
		downHeap(minim);
	}
}

void sterge(int x)
{
	swap(poz[ heap[x] ],poz[ heap[dimHeap] ]);
	swap(heap[x],heap[dimHeap]);

	dimHeap--;

	if(a[ heap[x/2] ]>a[ heap[x] ])
		upHeap(x);
	else
		downHeap(x);
}
int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);

	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d",&x);

			a[++N]=x;

			heap[++dimHeap]=N;
			poz[N]=dimHeap;
			upHeap(dimHeap);
		}else
		if(op==2)
		{
			scanf("%d",&x);
			
			sterge(poz[x]);
		}else
		if(op==3)
		{
			printf("%d\n",a[ heap[1] ]);
		}
	}
	
	return 0;
}