Cod sursa(job #713488)

Utilizator lunat1cHobinca Bogdan lunat1c Data 14 martie 2012 18:12:10
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

using namespace std;

ifstream in("heapuri.in");
ofstream out("heapuri.out");

int heap[2000001], ord[2000001], m, n, k;


void urcare(int poz);
void coborare(int poz);

void adaugare(int val)
{
	heap[++n]=ord[++k]=val;
	urcare(n);
}

int cautare(int val, int i)
{
	for(i=1; i<=n; i++)
		if(heap[i]==val) return i;
	return -1;
}

void stergere (int poz)
{
	heap[poz]=heap[n--];
	if(heap[poz>>1] > heap[poz])
		urcare(poz);
	else coborare(poz);
}

void urcare(int poz)
{
	int temp=heap[poz], i=poz;
	while(heap[i>>1] > temp && i>>1)
		heap[i]=heap[i>>1], i=i>>1;
	heap[i]=temp;
}

void coborare(int poz)
{
	bool ok=true;
	while(poz<<1<n && ok)
	{
		ok=false;
		int Min=(heap[poz<<1]<heap[(poz<<1)+1] ? poz<<1 : (poz<<1)+1);
		if(heap[Min]<heap[poz])
		{
			int temp=heap[poz], i=(poz<<1==Min ? poz<<1 : (poz<<1)+1);
			heap[poz]=heap[i];
			heap[i]=temp;
			coborare(i);
			ok=true;
		}
	}
	if(poz<<1==n && heap[poz<<1]<heap[poz])
	{
		int temp=heap[poz];
		heap[poz]=heap[poz<<1];
		heap[poz<<1]=temp;
	}
}

void meniu()
{
	int x;
	in>>m;
	while(m)
	{
		m--;
		in>>x;
		switch(x)
		{
			case 1: in>>x;
					adaugare(x);
					break;
			case 2: in>>x;
					stergere(cautare(ord[x],1));
					break;
			case 3: out<<heap[1]<<"\n";
		}
	}
}

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