Cod sursa(job #955968)

Utilizator tudorv96Tudor Varan tudorv96 Data 1 iunie 2013 23:08:23
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <iostream>
using namespace std;

#define N 200005
#define in "heapuri.in"
#define out "heapuri.out"
#define xx first
#define yy second
#define oo (1 << 30)

typedef pair <int, int> date;

int ord[N], n, elem, hs; //ord - pozitia in heap a elemntului al i-lea adaugat
date H[N]; //first - elem, second - pozitia in ord a elementului

void swap(date &x, date &y) {
	date aux = x;
	x = y;
	y = aux;
}

void swap(int &x, int &y) {
	int aux = x;
	x = y;
	y = aux;
}

void insert(int x) {
	H[++hs].xx = x;
	H[hs].yy = ++elem;
	ord[elem] = hs;
	int k = hs;
	while (k / 2 > 0 && H[k / 2].xx > H[k].xx) {
		swap (ord[H[k].yy], ord[H[k / 2].yy]);
		swap (H[k], H[k / 2]);
		k /= 2;
	}
}

void eject(int i) {
	H[i] = H[hs];
	H[hs--].xx = oo;
	int k = i, fiu = 0;
	while (fiu <= hs) {
		if (H[k].xx < H[2 * k + 1].xx && H[k].xx >= H[2 * k].xx)
			fiu = 2 * k;
		else
			if (H[k] >= H[2 * k + 1] && H[k] < H[2 * k])
				fiu = 2 * k;
		else
			if (H[k] >= H[2 * k] && H[k] >= H[2 * k + 1]) {
				if (H[2 * k] < H[2 * k + 1])
					fiu = 2 * k;
				else
					fiu = 2 * k + 1;
			}
		else
			break;
		swap (ord[H[k].yy], ord[H[fiu].yy]);
		swap (H[k], H[fiu]);
		k = fiu;
	}
}
				

int main() {
	ifstream fin (in);
	fin >> n;
	ofstream fout (out);
	for (int i = 1; i < N; ++i)
		H[i].xx = oo;
	for (int i = 0; i < n; ++i) {
		int t;
		fin >> t;
		if (t == 3) {
			fout << H[1].xx << "\n";
			continue;
		}
		int x;
		fin >> x;
		if (t == 1)
			insert(x);
		if (t == 2)
			eject(ord[x]);
		/*for (int i = 1; i <= hs; ++i)
			cout << H[i].xx << " " << H[i].yy << "\n";
		for (int i = 1; i <= elem; ++i)
			cout << ord[i] << " ";
		cout << "\n\n\n";*/
	}
	fcloseall();
	return 0;
}