Cod sursa(job #344833)

Utilizator serbanlupulupulescu serban serbanlupu Data 31 august 2009 18:58:36
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>

using namespace std;

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

#define T i/2
#define R 2*i
#define L 2*i+1

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[min], v[i]);
		swap(poz[min], poz[i]);
		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);
	}
}

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

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