Cod sursa(job #245487)

Utilizator alex23alexandru andronache alex23 Data 18 ianuarie 2009 09:34:48
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#define NMAX 200005

using namespace std;

struct nod{
	int val;
	int nrOrdine;
};

nod a[NMAX];
int pozitie[NMAX];

FILE *f = fopen("heapuri.in", "r"), *g = fopen("heapuri.out", "w");

int N, q = 0, nrElemente = 0;
void schimba(int x, int y)
{
	int aux;
	aux = a[x].val;
	a[x].val = a[y].val;
	a[y].val = aux;
	aux = a[x].nrOrdine;
	a[x].nrOrdine = a[y].nrOrdine;
	a[y].nrOrdine = aux;
	aux = pozitie[a[x].nrOrdine];
	pozitie[a[x].nrOrdine] = pozitie[a[y].nrOrdine];
	pozitie[a[y].nrOrdine] = aux;

}
void insert(int x, int i)
{
	nrElemente++;
	a[nrElemente].val = x;
	a[nrElemente].nrOrdine = i;
	int k = nrElemente;
	while (a[k].val < a[k / 2].val)
	{
		schimba(k, k / 2);
		k = k / 2;
	}
}

void remove(int x)
{
	a[x].val = a[nrElemente].val;
	a[x].nrOrdine = a[nrElemente].nrOrdine;
	nrElemente--;
	pozitie[a[x].nrOrdine] = x;
	int k = x;
	while ((2 * k + 1 <= nrElemente) && ((a[k].val > a[2 * k].val) || (a[k].val > a[2 * k + 1].val)))
	{
		if ((a[k].val > a[2 * k].val) && (a[k].val > a[2 * k + 1].val)) 
		{
			if (a[2 * k].val > a[2 * k + 1].val)
			{
				schimba(k, 2 * k + 1);
				k = 2 * k + 1;
			}
			else
			{
				schimba(k, 2 * k);
				k = 2 * k;
			}
		}
		else
		{
			if (a[k].val > a[2 * k].val)
			{
				schimba(k, 2 * k);
				k = 2 * k;
			}
			else
			{
				schimba(k, 2 * k + 1);
				k = 2 * k + 1;
			}
		}
	}
	if ((2 * k <= nrElemente) && (a[k].val > a[2 * k].val))
	{
		schimba(k, 2 * k);
		k = 2 * k;
	}
}
int main()
{
	fscanf(f, "%d", &N);
	for (int i = 0; i < N; ++i)
	{
		int tip;
		fscanf(f, "%d", &tip);
		if (tip != 3)
		{
			int x;
			fscanf(f, "%d", &x);
			if (tip == 1)
			{
				q++;
				pozitie[q] = nrElemente + 1;
				insert(x, q);
			}
			else
			{
				remove(pozitie[x]);
			}
		}
		else
		{
			fprintf(g, "%d\n", a[1].val); 
		}
	}

	fclose(f);
	fclose(g);
	return 0;
}