Cod sursa(job #972460)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 11 iulie 2013 19:18:42
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <vector>
#include <utility>

class Heap
{
	std::vector<int> myP;
	std::vector<std::pair<int, int> > myV;
public:
	void heapify(int i)
	{
		int r1 = 2 * i + 1, r2 = 2 * i + 2, comp = i;
		if(r1 <= myV.size() - 1)
			if(myV[r1].first < myV[comp].first) comp = r1;
		if(r2 <= myV.size() - 1)
			if(myV[r2].first < myV[comp].first) comp = r2;
		if(comp != i)
		{
			std::swap(myV[i], myV[comp]);
			myP[myV[i].second] = i;
			myP[myV[comp].second] = comp;
			heapify(comp);
		}
	}
	void insert(int a)
	{
		myP.push_back(0);
		myV.push_back(std::make_pair(a, myP.size() - 1));
		myP[myV.back().second] = myV.size() - 1;
		if(myV.size() == 1) return;
		int i;
		if(myV.size() - 1 % 2 == 0) i = (myV.size() - 1) / 2 - 1;
		else i = (myV.size() - 1) / 2;
		if(myV[i] > myV[myV.size() - 1])
		{
			int n = myV.size() - 1;
			std::swap(myV[i], myV[n]);
			myP[myV[i].second] = i;
			myP[myV[n].second] = n;
			siftup(i);
		}	
	}
	void siftup(int a)
	{
		if(!a) return;
		int i;
		if(a % 2 == 0) i = a / 2 - 1;
		else i = a / 2;
		if(myV[i].first > myV[a].first)
		{
			std::swap(myV[i], myV[a]);
			myP[myV[i].second] = i;
			myP[myV[a].second] = a;
			siftup(i);
		}
	}
	void del(int i)
	{
		i = myP[i];
		if(i == myV.size() - 1) 
		{
			myV.pop_back(); 
			return;
		}
		myV[i] = myV.back();
		myP[myV[i].second] = i;
		myV.pop_back();
		heapify(i);
	}
	int top()
	{
		return myV[0].first;
	}
};

int main(void)
{
	std::ofstream out("heapuri.out");
	std::ifstream in("heapuri.in");
	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);
		}
		if(a == 2)
		{
			in >> b;
			b--;
			c.del(b);
		}
		if(a == 3)
		{
			out << c.top() << "\n";
		}
	}
	return 0;
}