Cod sursa(job #1691195)

Utilizator vasica38Vasile Catana vasica38 Data 17 aprilie 2016 11:23:07
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<fstream>
#define nmax 200005
int n, sz, h[nmax], pos_h[nmax], pos_a[nmax], k;

/*template <class T> void swap(T &a, T &b)
{
	T aux;
	aux = a;
	a = b;
	b = aux;
}
*/

void Swap(int x, int y)
{
	int a1 = pos_a[x];
	int a2 = pos_a[y];
	std::swap(h[x], h[y]);
	pos_a[y] = a1;
	pos_h[a1] = y;
	pos_a[x] = a2;
	pos_h[a2] = x;
}

void up(int pos)
{
	while (pos > 1 && h[pos] < h[pos / 2])
	{
		Swap(pos, pos / 2);
		pos /= 2;
	}
}

void coboara(int pos)
{
	while (2 * pos <= sz)
	{
		int son = 2 * pos;
		if (2 * pos + 1 <= sz && h[2 * pos + 1] < h[son]) ++son;
		if (h[pos]>h[son])
		{
			Swap(pos, son);
			pos = son;
		}
		else break;
	}
}


void ins(int val)
{
	h[++sz] = val;
	pos_h[k] = sz;
	pos_a[sz] = k;
	up(sz);
}


void del(int pos)
{
	Swap(pos, sz);
	--sz;
	if (h[pos] < h[pos / 2]) up(pos); else coboara(pos);
}


int main()
{
	std::ifstream cin("heapuri.in");
	std::ofstream cout("heapuri.out");
	cin >> n;
	while (n--)
	{
		int x, y;
		cin >> y;
		if (y == 1)
		{
			++k;
			cin >> x;
			ins(x);
		}
		if (y == 2)
		{
			cin >> x;
			del(pos_h[x]);
		}
		if (y == 3)
		{
			cout << h[1] << "\n";
		}
	}
	return 0;
}