Cod sursa(job #1018025)

Utilizator sorin2kSorin Nutu sorin2k Data 28 octombrie 2013 19:57:44
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<iostream>
using namespace std;

int cron[200000], heap[200000], poz[200000], nrElem, nrHeap;

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

void insert(int x) {
	nrElem++;
	nrHeap++;
	cron[nrElem] = x;
	heap[nrHeap] = nrElem;
	poz[nrHeap] = nrElem;

	int i = nrElem;
	while(i >= 1 && cron[heap[i]] < cron[heap[i / 2]]) {
		// elementul e mai mare decat parintele sau
		swap(heap[i], heap[i / 2]);
		poz[heap[i]] = i;
		poz[heap[i/2]] = i/2;
		i /= 2;
	}
}

void delete_heap(int x) {
	swap(heap[poz[x]], heap[nrHeap]);
	poz[heap[x]] = x;
	nrHeap--;

	int parent = poz[x];
	int left = 2 * parent, right = 2 * parent + 1;
	while(left <= nrHeap) {
		// choose the minimum child
		int child = left;
		if(right <= nrHeap && cron[heap[right]] < cron[heap[left]]) {
			child = right;
		}

		if(cron[heap[child]] < cron[heap[parent]]) {
			swap(heap[parent], heap[child]);
			poz[heap[parent]] = parent;
			poz[heap[child]] = child;
			parent = child;
			left = parent * 2;
			right = parent * 2 + 1;
		} else {
			left = nrElem + 1;
		}
	}
}

void printMin() {
	cout << cron[heap[1]] << '\n';
}

void printHeap() {
	int i;
	for(i = 1; i <= nrHeap; i++) {
		cout << cron[heap[i]] << " ";
	}
	cout << endl;
}

int main() {
	int i, n, opt, x;
	cin >> n;
	for(i = 0; i < n; i++) {
		cin >> opt;
		if(opt == 1) {
			cin >> x;
			insert(x);
		//	printHeap();
		}
		if(opt == 2) {
			cin >> x;
			delete_heap(x);
		//	printHeap();
		}
		if(opt == 3) {
			printMin();
		}
	}
}