Cod sursa(job #1405068)

Utilizator sorin2kSorin Nutu sorin2k Data 28 martie 2015 20:15:36
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<cstdio>
#include<algorithm>
using namespace std;

int cron[200001], heap[200001], poz_heap[200001];
int nr_elem, nr_heap;

int fiu_minim(int poz) {
	int fiu = 0;
	if (2*poz < nr_heap) {
		fiu = 2*poz;
	}
	if (2*poz+1 < nr_heap && cron[heap[fiu]] > cron[heap[2*poz+1]]) {
		fiu = 2*poz+1;
	}
	return fiu;
}

void sift(int poz) {
	int fiu = fiu_minim(poz);
	while (2*poz < nr_heap && cron[heap[fiu]] < cron[heap[poz]]) {
		swap(heap[fiu], heap[poz]);
		poz_heap[heap[fiu]] = fiu;
		poz_heap[heap[poz]] = poz;
		poz = fiu;
		fiu = fiu_minim(poz);
	}
}

void percolate(int poz) {
	int parent = poz/2;
	while (parent >= 1 && cron[heap[poz]] < cron[heap[parent]]) {
		swap(heap[poz], heap[parent]);
		poz_heap[heap[poz]] = poz;
		poz_heap[heap[parent]] = parent;
		poz = parent;
		parent = poz/2;
	}
}

void insereaza(int x) {
	cron[nr_elem] = x;
	heap[nr_heap] = nr_elem;
	poz_heap[nr_elem] = nr_heap;
	nr_elem++;
	nr_heap++;
	percolate(nr_heap-1);
}

void sterge(int poz) {
	int ph = poz_heap[poz];
	// pune ph pe ultima pozitie
	swap(heap[ph], heap[nr_heap-1]);
	poz_heap[heap[ph]] = ph;
	nr_heap--;

	percolate(ph);
	sift(ph);
}

int main() {
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	int n, tip, x, i;
	nr_heap = 1;
	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		scanf("%d", &tip);
		if (tip == 1) {
			scanf("%d", &x);
			insereaza(x);
		} else {
			if (tip == 2) {
				scanf("%d", &x);
				sterge(x-1);
			} else {
				printf("%d\n", cron[heap[1]]);
			}
		}
	}
	return 0;
}