Cod sursa(job #521488)

Utilizator Catah15Catalin Haidau Catah15 Data 12 ianuarie 2011 18:23:18
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#define ll long long
#define maxn 200010
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
	
long long n, val[maxn], heap[maxn], poz_heap[maxn], x, m, y;

void push(int nod)
{
	ll aux;
	
	while(val[heap[nod]] < val[heap[nod / 2]] && nod / 2)
	{
		aux = heap[nod];
		heap[nod] = heap[nod / 2];
		heap[nod / 2] = aux;
		
		poz_heap[heap[nod]] = nod;
		poz_heap[heap[nod / 2]] = nod / 2;
		nod /= 2;
	}
}

void inserare()
{
	f >> x;
	
	y++;
	m++;
	
	val[m] = x;
	heap[y] = m;
	poz_heap[m] = y;
	
	push(y);
}

void scufunda(int nod)
{
	ll aux;
	
	while((val[heap[nod]] > val[heap[nod * 2]] || val[heap[nod]] > val[heap[nod * 2 + 1]] ) && nod * 2 <= m)
	if(val[heap[nod * 2]] <= val[heap[nod * 2 + 1]])
	{	
		aux = heap[nod];
		heap[nod] = heap[nod * 2];
		heap[nod * 2] = aux;
		
		
		poz_heap[heap[nod]] = nod;
		poz_heap[heap[nod * 2]] = nod * 2;
		
		nod *= 2;
	}
	else 
	{
		aux = heap[nod];
		heap[nod] = heap[nod * 2 + 1];
		heap[nod * 2 + 1] = aux;
		
		
		poz_heap[heap[nod]] = nod;
		poz_heap[heap[nod * 2 + 1]] = nod * 2 + 1;
		
		nod = nod * 2 + 1;
	}
		
}

void sterge()
{
	f >> x;
	
	ll poz = poz_heap[x];
	
	
	heap[poz] = heap[m];
	poz_heap[heap[poz]] = poz_heap[heap[m]];
	--m;
	scufunda(poz);
	
}


int main()
{
	
	
	f >> n;
	
	for(int i = 1; i <= n; ++i)
	{
		int cod;
		
		f >> cod;
		
		if(cod == 1) inserare();
		if(cod == 2) sterge();
		if(cod == 3) g << val[heap[1]] << '\n';
	}
	
	/*for(int i = 1; i <= 4; ++i)
		cout << val[i] << " ";
	cout << '\n';
	
	for(int i = 1; i <= 4; ++i)
		cout << heap[i] << " ";
	cout << '\n';
	
	for(int i = 1; i <= 4; ++i)
		cout << poz_heap[i] << " ";
	cout << '\n';
	*/
	
	
	f.close();
	g.close();
	
	return 0;
}