Cod sursa(job #774100)

Utilizator gicu_01porcescu gicu gicu_01 Data 3 august 2012 14:36:15
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
/*
Heap-uri.
*/

#include <iostream>
#include <stdio.h>

#define MAXN		200000
#define STANG(i)	(2 * i)
#define DREPT(i)	(2 * i + 1)

using namespace std;

int n, sz_heap, sz;
int heap[MAXN], poz[MAXN], vector[MAXN];

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

void filtru_sus (int i) {
	while (i > 1 && vector[heap[i]] < vector[heap[i / 2]]) {
		swap(poz[heap[i]], poz[heap[i / 2]]);
		swap(heap[i], heap[i / 2]);
		i = i / 2;
	}
}

void filtru_jos (int i) {
	int p = 1;
	while (p) {
		p = 0;
		if (STANG(i) <= sz_heap) {
			p = STANG(i);
			if (DREPT(i) <= sz_heap && vector[heap[p + 1]] < vector[heap[p]])
				++p;
			if (p) {
				swap(poz[heap[p]], poz[heap[i]]);
				swap(heap[p], heap[i]);
				i = p;
			}
		}
	}
}

void adauga (int x) {
	vector[++sz] = x;
	heap[++sz_heap] = sz;
	poz[sz] = sz_heap;
	filtru_sus(sz_heap);
}

void sterge (int x) {
	poz[heap[sz_heap]] = x;
	swap(heap[x], heap[sz_heap]);
	--sz_heap;
	if (x > 1 && vector[heap[x]] < vector[heap[x / 2]])
		filtru_sus(x);
	else
		filtru_jos(x);
}

int main () {
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);

	int i, tip_operatie, x;
	scanf("%d", &n);
	for (i = 1; i <= n; i++) {
		scanf("%d", &tip_operatie);
		switch (tip_operatie) {
			case 1: {
				scanf("%d", &x);
				adauga(x);
			}
			break;
			case 2: {
				scanf("%d", &x);
				sterge(poz[x]);
			}
			break;
			case 3: {
				printf("%d\n", vector[heap[1]]);
			}
			break;
		}
	}

	return 0;
}