Cod sursa(job #713364)

Utilizator lunat1cHobinca Bogdan lunat1c Data 14 martie 2012 16:10:02
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>

using namespace std;

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

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

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

inline int fiu_st (int n)
{
	return n*2;
}

inline int fiu_dr (int n)
{
	return n*2+1;
}

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)
{
	if(heap[i]==val) return i;
	if(heap[i]>val) return 0;
	if(fiu_st(i)<n && fiu_dr(i)<=n)
	{
		int x, y;
		x=cautare(val, fiu_st(i));
		y=cautare(val, fiu_dr(i));
		return (x>y ? x : y);
	}
	if(fiu_st(i)<=n) return cautare(val, fiu_st(i));
	return 0;
}

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

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

void coborare(int poz)
{
	bool ok=true;
	while(fiu_st(poz)<n && ok)
	{
		ok=false;
		int Min=(fiu_st(poz)<fiu_dr(poz) ? fiu_st(poz) : fiu_dr(poz));
		if(heap[Min]<heap[poz])
		{
			int temp=heap[poz], i=(fiu_st(poz)==Min ? fiu_st(poz) : fiu_dr(poz));
			heap[poz]=heap[i];
			heap[i]=temp;
			coborare(i);
			ok=true;
		}
	}
	if(fiu_st(poz)==n && heap[fiu_st(poz)]<heap[poz])
	{
		int temp=heap[poz];
		heap[poz]=heap[fiu_st(poz)];
		heap[fiu_st(poz)]=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;
}