Cod sursa(job #2403890)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 12 aprilie 2019 00:28:05
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class MinHeap {
	private:
		void heapify(unsigned int root);

		vector<int> insertHistory;
		vector<int> H;
	public:
		void insert(int value);
		void remove(unsigned int insertIndex);
		int getMinim() {
			return (H.size() > 0) ? H[0] : numeric_limits<int>::min();
		}
		void print();
};

void MinHeap::heapify(unsigned int root) {
	unsigned int minimum = root;
	unsigned int left = 2 * root + 1;
	unsigned int right = 2 * root + 2;

	if (left < H.size() && H[left] < H[minimum])
		minimum = left;

	if (right < H.size() && H[right] < H[minimum])
		minimum = right;

	if (minimum != root) {
		swap(H[minimum], H[root]);
		heapify(minimum);
	}
}

void MinHeap::insert(int value) {
	insertHistory.push_back(value);
	H.push_back(value);
	if (H.size() >= 1) {
		swap(H[0], H[ H.size() - 1 ]);
		heapify(0);
	}
}

void MinHeap::remove(unsigned int insertIndex) {
	int value = insertHistory[insertIndex - 1];
	unsigned int pos = -1;
	for (unsigned int i = 0; i < H.size(); ++i) {
		if (H[i] == value) {
			pos = i;
			break;
		}
	}

	swap(H[pos], H[ H.size() - 1 ]);
	H.pop_back();
	heapify(pos);
}

void MinHeap::print() {
	for (vector<int>::iterator it = H.begin(); it != H.end(); ++it) {
		cout << *it << " ";
	}
	cout << "\n";
}

int main() {
	MinHeap * H = new MinHeap();

	ifstream fin("heapuri.in");
	ofstream fout("heapuri.out");

	unsigned int Q, task, value;
	fin >> Q;
	for (unsigned int i = 0; i < Q; ++i) {
		fin >> task;

		switch (task) {
			case 1: // insert
				fin >> value;
				H->insert(value);
				break;
			case 2: // remove
				fin >> value;
				H->remove(value);
				break;

			case 3: // get min
			default:
				fout << H->getMinim() << "\n";
				break;
		}
	}

	fin.close();
	fout.close();
	delete H;

	return 0;
}