#include <iostream>
#include <queue> // priority_queue
#include <utility> // pair
#include <functional> // greater
#include <limits>

using namespace std;

int main() {
	cout << "Hello containers !" << endl;

	cout << "# Priority queue" << endl;
	cout << "## With integers" << endl;

	priority_queue<int> pqInt;

	pqInt.push(5);
	pqInt.push(2);
	pqInt.push(0);
	pqInt.push(42);
	pqInt.push(3);
	pqInt.push(numeric_limits<int>::max());

	while (!pqInt.empty()) {
		cout << pqInt.top() << " > ";
		pqInt.pop();
	}
	cout << endl;

	cout << "## With pairs" << endl;

	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pqPair;

	pqPair.push(make_pair(4, 4));
	pqPair.push(make_pair(4, 5));
	pqPair.push(make_pair(5, 5));
	pqPair.push(make_pair(2, 5));
	pqPair.push(make_pair(0, 5));
	pqPair.push(make_pair(42, 5));
	pqPair.push(make_pair(3, 5));
	pqPair.push(make_pair(3, 5));
	pqPair.push(make_pair(3, 2));
	pqPair.push(make_pair(3, 0));
	pqPair.push(make_pair(3, 42));
	pqPair.push(make_pair(3, 3));

	while (!pqPair.empty()) {
		cout << pqPair.top().first << ';' << pqPair.top().second << " > ";
		pqPair.pop();
	}
	cout << endl;

	return 0;
}