Cod sursa(job #972094)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 10 iulie 2013 23:21:19
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#include <map>

class Heap
{
	std::vector<int> myV;
	std::map<int, int> myM;	
public:
	void heapify(int i)
	{
		int left = 2 * i + 1, right = 2 * i + 2, j = i;
		if(left < myV.size() && myV[left] < myV[j]) std::swap(left, j);
		if(right < myV.size() && myV[right] < myV[j]) std::swap(right, j);
		if(j != i)
		{
			myM[myV[i]] = j;
			myM[myV[j]] = i;
			std::swap(myV[i], myV[j]);
			heapify(j);
		}
	}
	void insert(int a)
	{
		myV.push_back(a);
		int i = myV.size() - 1;
		myM[a] = i;
		while(i)
		{
			int j;
			if(i % 2 == 0) j = i / 2 - 1;
			else j = i / 2;
			if(myV[i] < myV[j])
			{
				myM[myV[i]] = j;
				myM[myV[j]] = i;
				std::swap(myV[i], myV[j]);
				i = j;
			}
			else break;
		}
	}
	void del(int a)
	{
		myV[myM[a]] = myV.back();
		myM[myV.back()] = myM[a];
		myV.pop_back();
		heapify(myM[a]);
		myM[a] = -1;
	}
	int min()
	{
		return myV[0];
	}
};

int main()
{
	std::ofstream out("heapuri.out");
	std::ifstream in("heapuri.in");
	std::vector<int> myV;
	Heap c;
	int nO, a, b;
	in >> nO;
	for(int i(0); i < nO; i++)
	{
		in >> a;
		if(a == 1)
		{
			in >> b;
			c.insert(b);
			myV.push_back(b);
		}
		if(a == 2)
		{
			in >> b;
			b--;
			c.del(myV[b]);
		}
		if(a == 3)
		{
			out << c.min() << std::endl;
		}
	}
	return 0;
}