Cod sursa(job #372020)

Utilizator cristiprgPrigoana Cristian cristiprg Data 8 decembrie 2009 11:29:09
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#define DIM 200002

int heap[DIM], v[DIM], poz[DIM], n, nrpoz;

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

void add(int x)
{
	
	v[++nrpoz] = x;
	++n;
	heap[n] = nrpoz;
	poz[nrpoz]=n;
//	printf("add : %d n = %d nrpoz = %d\n", x, n, nrpoz);
	int este_heap = 0, i = n;
	while (!este_heap && i > 1)
	{
		if (v[ heap[i/2] ] < v[ heap[i] ])
			este_heap = 1;
		else
		{
			swap(heap[i], heap[i/2]);
			poz[heap[i]] = i;
			poz[heap[i/2]] = i/2;
			i /= 2;
		}
	}
	
}


void sterge(int x)
{
//	printf ("delete %d\n", x);
	int i = poz[x], k;
	bool este_heap = false;
	heap[ i ] = heap[n--];
	poz[ heap[i] ] = i;
	while (!este_heap && 2 * i <= n)
	{
		k = 2 * i;
		if (k + 1 <= n && v[ heap[k] ] > v[ heap[k + 1] ])
			++k;
		if (v[heap[i]] < v[heap[k]])
			este_heap = true;
		else
		{
			swap(heap[i], heap[k]);
			poz[heap[i]] = i;
			poz[heap[k]] = k;
			i = k;
		}
		
	}
}

void afisare()
{
	for (int i = 1; i <= n; ++i)
		printf("%d ", v[heap[i]]);
	printf("\n");
}

int main()
{
	int nrop, op, x;
	FILE *f = fopen("heapuri.in", "r"), *g = fopen("heapuri.out", "w");
	
	fscanf(f, "%d", &nrop);
	
	for (;nrop; --nrop)
	{
		fscanf(f, "%d", &op);
		
		if (op == 3)
			fprintf(g, "%d\n", v[heap[1]]);
		else
		{
			fscanf(f, "%d", &x);
			if (op == 1)
				add(x);
			else
				sterge(x);
		}
		
//		afisare();
	}
	
	fcloseall();
	return 0;
}