Cod sursa(job #1095260)

Utilizator horatiu13Horatiu horatiu13 Data 30 ianuarie 2014 16:51:58
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#define Nmax 200002

using namespace std;

FILE *fi = fopen("heapuri.in", "r");
FILE *fo = fopen("heapuri.out", "w");
int v[Nmax];
int ord[Nmax];
int t;
int m = 0;
int n = 0;

void scmb(int &a, int &b)
{
	int aux = a;
	a = b;
	b = aux;
}

void sift(int k, int n)
{
	int fiu = 0;
	
	do
	{
		fiu = 0;
		
		if (2*k <= n)
		{
			fiu = 2*k;
			if (2*k+1 <= n && v[2*k+1] < v[2*k])
				fiu = 2*k+1;
			if (v[fiu] >= v[k])
				fiu = 0;
		}
		
		if (fiu)
		{
			scmb(v[k], v[fiu]);
			k = fiu;
		}
		
	}while(fiu);
}

void percolate(int k, int n)
{
	int val = v[k];
	while (k > 1 && val < v[k/2])
	{
		v[k] = v[k/2];
		k /= 2;
	}
	v[k] = val;
}

int cautare(int val, int k)
{
	if (v[k] == val) return k;
	if (2*k <= n && val >= v[2*k]) cautare(val, 2*k);
	if (2*k+1 <= n && val >= v[2*k+1]) cautare(val, 2*k+1);
}

void stergere(int k, int &n)
{
	v[k] = v[n];
	if (k > 1 && v[k] < v[k/2]) percolate(k, n);
	else sift(k, n);
}

int main()
{
	fscanf(fi, "%d", &t);
	int x;
	int y;
	
	for (; t; t--)
	{
		fscanf(fi, "%d", &y);
		
		if (y == 1)
		{
			fscanf(fi, "%d", &x);
			v[++n] = x;
			ord[++m] = x;
			if (n > 1) percolate(n, n);
		}
		else if (y == 2)
		{
			fscanf(fi, "%d", &x);
			int poz = cautare(ord[x], 1);
			stergere(poz, n);
		}
		else if (y == 3)
		{
			fprintf(fo, "%d\n", v[1]);
		}
	}
	return 0;
}