Cod sursa(job #1094591)

Utilizator horatiu13Horatiu horatiu13 Data 29 ianuarie 2014 16:55:50
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 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]);
			scmb(ord[k], ord[fiu]);
			k = fiu;
		}
		
	}while(fiu);
}

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

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

void stergere(int k, int &n)
{
	v[k] = v[n];
	ord[k] = ord[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[n] = ++m;
			if (n > 1) percolate(n, n);
		}
		else if (y == 2)
		{
			fscanf(fi, "%d", &x);
			int poz = cautare(x, 1);
			stergere(poz, n);
		}
		else if (y == 3)
		{
			fprintf(fo, "%d\n", v[1]);
		}
	}
	return 0;
}