Cod sursa(job #1959983)

Utilizator vladvlad00Vlad Teodorescu vladvlad00 Data 10 aprilie 2017 09:13:11
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;

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

struct elem
{
	int x, cine;
};

void ins(int nr, int p);
void del(int p);

int n, m, num, poz[200005];
elem H[200005];

int main()
{
	int i, op, x;

	fin >> m;
	for (i = 1; i <= m; i++)
	{
		fin >> op;
		if (op == 1 || op == 2)
		{
			fin >> x;
			if (op == 1)
				ins(x,++num);
			else del(x);
		}
		else fout << H[1].x << '\n';
	}
	return 0;
}

void ins(int nr, int p)
{
	int tata, fiu;

	fiu = ++n;
	tata = n / 2;
	while (tata && nr < H[tata].x)
	{
		poz[H[tata].cine] = fiu;
		H[fiu] = H[tata];
		fiu = tata;
		tata = fiu / 2;
	}
	poz[p] = fiu;
	H[fiu].x = nr;
	H[fiu].cine = p;
}

void del(int p)
{
	int tata, fiu;

	H[poz[p]] = H[n--];
	poz[H[poz[p]].cine] = poz[p];
	tata = poz[p];
	while (1)
	{
		fiu = 2 * tata;
		if (fiu > n)
			break;
		if (fiu < n && H[fiu].x > H[fiu + 1].x)
			fiu++;
		if (H[tata].x < H[fiu].x)
			break;
		poz[H[fiu].cine] = tata;
		poz[H[tata].cine] = fiu;
		swap(H[tata], H[fiu]);
	}
}