Cod sursa(job #367880)

Utilizator cristiprgPrigoana Cristian cristiprg Data 23 noiembrie 2009 18:15:32
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define DIM 200010
typedef int Heap [DIM];

int n, a[DIM], poz[DIM], N;
Heap H;
inline int father(int nod){
	return nod/2;
}

inline int left_son(int nod){
	return nod * 2;
}

inline int right_son(int nod){
	return nod * 2 + 1;
}

void sift(Heap H, int n, int k)
{
	int son;
	do
	{
		son = 0;
		if (left_son(k) <= n)
		{
			son = left_son(k);
			if (right_son(k) <= n && H[right_son(k)] < H[left_son(k)])
				son = right_son(k);
			if (H[son] >= H[k])
				son = 0;
		}
		
		if (son)
		{
			swap(H[k], H[son]);
			k = son;
		}
		
		
	}	while (son);
}

void percolate(Heap H, int n, int k)
{
	int key = H[k];
	
	while (k > 1 && key < H[father(k)])
	{
		H[k] = H[father(k)], k = father(k);
		swap(poz[k], poz[father(k)]);
	}
	H[k] = key;
	
}

void build_heap(Heap H, int n)
{
	for (int i= n / 2; i; --i)
		sift(H, n, i);
}


void cut(Heap H, int &n, int k)
{
	H[k] = H[n];
	--n;
	
	if (k > 1 && H[k] < H[father(k)])
		percolate(H, n, k);
	else
		sift(H, n, k);
}

void afisare(Heap H, int n)
{
	for (int i = 1; i <= n; ++i)
		printf ("%d ", H[i]);
	
	printf("\n||-----------||\n");
}

void insert(Heap H, int &n, int key)
{
	H[++n] = key;
	percolate(H, n, n);
}

int main()
{
	FILE *f = fopen("heapuri.in", "r"), *f2 = fopen("heapuri.out", "w");
	fscanf(f, "%d", &N);
	
	for (int i = 1, tip = 0, x, nr = 0; i <= N; ++i)
	{
		fscanf(f, "%d", &tip);
		if (tip == 1)
		{
			fscanf(f, "%d", &x);
			
			insert(H, n, x);
			a[++nr] = x;
			
		}
		
		else
			if (tip == 2)
			{
				fscanf(f, "%d", &x);
				cut(H, n, poz[a[x]]);
			}
			else
				fprintf(f2, "%d\n", H[1]);
	}
	
	fclose(f);
	fclose(f2);
	
	return 0;
}