Cod sursa(job #344855)

Utilizator serbanlupulupulescu serban serbanlupu Data 31 august 2009 19:57:53
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

#define T i>>1
#define L i<<1
#define R (i<<1)+1

vector<int > v(200001);
vector<int > poz(200001);
int nr_v, nr_poz;

inline void downheap(int i)
{
	int min=i;
	if (L <= nr_v)
		if (v[L] < v[min])
			min=L;

	if (R <= nr_v)
		if (v[R] < v[min])
			min=R;
	if (min != i)
	{
		swap (v[i], v[min]);
		swap (poz[i], poz[min]);
		downheap(min);
	}
}

inline void upheap(int i)
{
	if (i == 1)
		return;
	if (v[i] < v[T])
	{
		swap(v[i], v[T]);
		swap(poz[i], poz[T]);
		upheap(T);
		return;
	}
}

void solve()
{
	fstream f("heapuri.in", ios::in);
	fstream g("heapuri.out", ios::out);
	int n;
	int a,b;
	f>>n;
	for (int i=1; i<=n; ++i)
	{
		f>>a;
		if (a == 1)
		{
			f>>b;
			v[++nr_v]=b;
			poz[++nr_poz]=nr_v;
		}
		if (a == 2)
		{
			f>>b;
			swap(v[poz[b]], v[poz[nr_poz]]);
			--nr_v;
			swap(poz[b], poz[nr_v]);
		}
		if (a == 3)
		{
			for (int j=(nr_v>>2); j>=1; --j)
				downheap(j);

			g<<v[1]<<"\n";
		}
	}
	f.close();
	g.close();
}

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