Cod sursa(job #823009)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 24 noiembrie 2012 13:59:27
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
using namespace std;

int heap[200001], cron[200001], lvl[200001];
int l = 0;

void add(int x)
{
	heap[++l] = x;
	cron[l] = l; lvl[l] = l;
	int i=l, aux;
	while (i > 1 && heap[i] < heap[i/2])
	{
		aux = heap[i];
		heap[i] = heap[i/2];
		heap[i/2] = aux;
		
		aux = cron[i];
		cron[i] = cron[i/2];
		cron[i/2] = aux;
		
		aux = lvl[l];
		lvl[l] = lvl[i/2];
		lvl[i/2] = aux;
		
		i >>= 1;
	}
}

void cerne(int poz)
{
	if (2*poz > l) return;
	int aux;
	if (2*poz == l && heap[l] < heap[poz])
	{
		aux = heap[poz]; heap[poz] = heap[l]; heap[l] = aux;
		aux = cron[poz]; cron[poz] = cron[l]; cron[l] = aux;
		lvl[cron[poz]] = poz; lvl[cron[l]] = l;
		return;
	}
	
	int Min;
	if (heap[2*poz] < heap[2*poz+1]) Min = 2*poz;
	else Min = 2*poz+1;
	
	if (heap[Min] < heap[poz])
	{
		aux = heap[poz]; heap[poz] = heap[Min]; heap[Min] = aux;
		aux = cron[poz]; cron[poz] = cron[Min]; cron[Min] = aux;
		lvl[cron[Min]] = Min; lvl[cron[poz]] = poz;
		cerne(Min);
	}
}

void del(int x)
{
	heap[lvl[x]] = heap[l];
	cron[lvl[x]] = cron[l];
	lvl[cron[l]] = lvl[x];
	l--;
	cerne(lvl[x]);
}

int main()
{
	ifstream in("heapuri.in"); ofstream out("heapuri.out");
	int i, c, x, n;
	in>>n;
	for (i=0;i<n;++i)
	{
		in>>c;
		switch (c)
		{
			case 1: in>>x; add(x); break;
			case 2: in>>x; del(x); break;
			case 3: out<<heap[1]<<"\n"; break;
		}
	}
	return 0;
}