Cod sursa(job #360120)

Utilizator serbanlupulupulescu serban serbanlupu Data 29 octombrie 2009 21:49:13
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

int H[200005];
int nh;
int TimeV[200005];

void upheap(int i)
{
	if (H[i] < H[T])
	{
		swap(TimeV[i], TimeV[T]);
		swap(H[i], H[T]);
		upheap(T);
	}
};

void downheap(int i)
{
	int min=i;
	if (L <= nh)
		if (H[L] < H[min])
			min=L;
	if (R <= nh)
		if (H[R] < H[min])
			min=R;
	if (min!=i)
	{
		swap(TimeV[i], TimeV[min]);
		swap(H[i], H[min]);
		downheap(min);
	}
};

void solve(const char * buff_file)
{
	fstream f(buff_file, ios::in);
	fstream g("heapuri.out", ios::out);
	int n;
	f>>n;
	int dec, value;
	int nr=0;
	for (int i=1; i<=n; ++i)
	{
		f>>dec;
		if ( dec == 1)
		{
			nr++;
			f>>value;
			H[++nh]=value;
			TimeV[nr]=nh;
			upheap(nh);
		}
		if ( dec == 2 )
		{
			f>>value;
			for (int i=1; i<=nr; ++i)
				if (TimeV[i]==value)
				{
					swap(H[i], H[nh--]);
					downheap(i);
					break;
				}
		}
		if ( dec == 3)
			g<<H[1]<<" ";
	}
	f.close();
	g.close();
}

int main()
{
	solve("heapuri.in");
	return 0;
}