Cod sursa(job #1213623)

Utilizator vasile_pojogaPojoga Vasile vasile_pojoga Data 28 iulie 2014 17:10:13
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>

using namespace std;

void solve();
void push(int pos);
void pop(int pos);

int L,NR, A[200005], Heap[200005], Pos[200005];

int main()
{
	solve();
	return 0;
}

void solve()
{
	ifstream fin("heapuri.in");
	ofstream fout("heapuri.out");
	int c,n,val,pos;
	L = NR = 0;
	fin>>n;
	for(int i=0;i<n;i++)
	{
		fin>>c;
		if(c == 1)
		{
			fin>>val;
			++L; //lungimea heapului
			++NR; //lungimea vectorului cu valori
			A[NR] = val; //adaugarea valorii la capatul vectorului
			Heap[L] = NR; //adaugarea indicelui valorii in heap
			Pos[NR] = L; //adaugarea pozitiei in heap a indicelui valorii
			push(L);
		}
		else if(c == 2)
		{
			fin>>pos;
			A[pos] = -1;
			push(Pos[pos]);
			
			Pos[Heap[1]] = 0; //<=> Pos[pos] = 0;
			Heap[1] = Heap[L];
			L--;
			Pos[Heap[1]] = 1;
			if(L>1)
			{
				pop(1);
			}
		}
		else if(c == 3)
		{
			fout<<A[Heap[1]]<<'\n';
		}
	}
}

void push(int pos)
{
	while((pos/2 > 0) && (A[Heap[pos]] < A[Heap[pos/2]]))
	{
		int temp = Heap[pos];
		Heap[pos] = Heap[pos / 2];
		Heap[pos / 2] = temp;

		Pos[Heap[pos]] = pos;
		Pos[Heap[pos/2]] = pos/2;

		pos = pos / 2;
	}
}

void pop(int pos)
{
	int parent = 0;
	while(pos != parent)
	{
		parent = pos;
		if((parent*2 <= L) && A[Heap[pos]]>A[Heap[parent*2]])
		{
			pos = parent * 2;
		}
		if((parent*2+1 <= L) && A[Heap[pos]]>A[Heap[parent*2+1]])
		{
			pos = parent*2+1;
		}

		int temp = Heap[parent];
		Heap[parent] = Heap[pos];
		Heap[pos] = temp;

		Pos[Heap[parent]] = parent;
		Pos[Heap[pos]] = pos;
	}
}