#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
#include <algorithm>
#include <queue>
using namespace std;
 
/*
Write a game leader board. Record user id and game score. Return top n players.
*/
 
struct UserWithScore {
	string user_id;
	int score;
	UserWithScore(string user_id_, int score_): user_id(user_id_), score(score_) {}
};
 
struct Compare {
	bool operator()(UserWithScore a, UserWithScore b) {
		return a.score > b.score;
	}
};
 
class GameLeaderBoard {
public:
	unordered_map<string,int> ht;
 
	void add_score(string user_id, int game_score) {
		auto it = ht.find(user_id);
		if (it == ht.end()) {
			ht.insert(make_pair(user_id, game_score));
		} else {
			if (game_score > it->second) {
				it->second = game_score;
			}
		}
	}
 
	vector<UserWithScore> get_top_n(int n) {
		vector<UserWithScore> out;
 
		priority_queue<UserWithScore, std::vector<UserWithScore>, Compare> min_heap;
 
		for (auto e : ht) {
			if (min_heap.size() < n) {
				min_heap.push(UserWithScore(e.first, e.second));
			} else {
				auto it = min_heap.top();
				if (it.score < e.second) {
					min_heap.pop();
					min_heap.push(UserWithScore(e.first, e.second));
				}
			}
		}
 
		while (!min_heap.empty()) {
			auto n = min_heap.top();
			min_heap.pop();
			out.push_back(n);
		}
 
		return out;
	}
};
 
void print(vector<UserWithScore> top_n) {
	for (int i = 0; i < top_n.size(); i++) {
		cout << "user: " << top_n[i].user_id << ", score: " << top_n[i].score << endl;
	}
	cout << '\n';
}
 
int main() {
	// your code goes here
 
	GameLeaderBoard g1;
	g1.add_score("gerald", 10);
	g1.add_score("tushar", 20);
	g1.add_score("gaurav", 15);
	g1.add_score("vishal", 3);
	print(g1.get_top_n(3));
 
	g1.add_score("gerald", 30);
	print(g1.get_top_n(3));
 
	return 0;
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxxdWV1ZT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8qCldyaXRlIGEgZ2FtZSBsZWFkZXIgYm9hcmQuIFJlY29yZCB1c2VyIGlkIGFuZCBnYW1lIHNjb3JlLiBSZXR1cm4gdG9wIG4gcGxheWVycy4KKi8KCnN0cnVjdCBVc2VyV2l0aFNjb3JlIHsKCXN0cmluZyB1c2VyX2lkOwoJaW50IHNjb3JlOwoJVXNlcldpdGhTY29yZShzdHJpbmcgdXNlcl9pZF8sIGludCBzY29yZV8pOiB1c2VyX2lkKHVzZXJfaWRfKSwgc2NvcmUoc2NvcmVfKSB7fQp9OwoKc3RydWN0IENvbXBhcmUgewoJYm9vbCBvcGVyYXRvcigpKFVzZXJXaXRoU2NvcmUgYSwgVXNlcldpdGhTY29yZSBiKSB7CgkJcmV0dXJuIGEuc2NvcmUgPiBiLnNjb3JlOwoJfQp9OwoKY2xhc3MgR2FtZUxlYWRlckJvYXJkIHsKcHVibGljOgoJdW5vcmRlcmVkX21hcDxzdHJpbmcsaW50PiBodDsKCQkKCXZvaWQgYWRkX3Njb3JlKHN0cmluZyB1c2VyX2lkLCBpbnQgZ2FtZV9zY29yZSkgewoJCWF1dG8gaXQgPSBodC5maW5kKHVzZXJfaWQpOwoJCWlmIChpdCA9PSBodC5lbmQoKSkgewoJCQlodC5pbnNlcnQobWFrZV9wYWlyKHVzZXJfaWQsIGdhbWVfc2NvcmUpKTsKCQl9IGVsc2UgewoJCQlpZiAoZ2FtZV9zY29yZSA+IGl0LT5zZWNvbmQpIHsKCQkJCWl0LT5zZWNvbmQgPSBnYW1lX3Njb3JlOwoJCQl9CgkJfQoJfQoJCgl2ZWN0b3I8VXNlcldpdGhTY29yZT4gZ2V0X3RvcF9uKGludCBuKSB7CgkJdmVjdG9yPFVzZXJXaXRoU2NvcmU+IG91dDsKCQkKCQlwcmlvcml0eV9xdWV1ZTxVc2VyV2l0aFNjb3JlLCBzdGQ6OnZlY3RvcjxVc2VyV2l0aFNjb3JlPiwgQ29tcGFyZT4gbWluX2hlYXA7CgkJCgkJZm9yIChhdXRvIGUgOiBodCkgewoJCQlpZiAobWluX2hlYXAuc2l6ZSgpIDwgbikgewoJCQkJbWluX2hlYXAucHVzaChVc2VyV2l0aFNjb3JlKGUuZmlyc3QsIGUuc2Vjb25kKSk7CgkJCX0gZWxzZSB7CgkJCQlhdXRvIGl0ID0gbWluX2hlYXAudG9wKCk7CgkJCQlpZiAoaXQuc2NvcmUgPCBlLnNlY29uZCkgewoJCQkJCW1pbl9oZWFwLnBvcCgpOwoJCQkJCW1pbl9oZWFwLnB1c2goVXNlcldpdGhTY29yZShlLmZpcnN0LCBlLnNlY29uZCkpOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXdoaWxlICghbWluX2hlYXAuZW1wdHkoKSkgewoJCQlhdXRvIG4gPSBtaW5faGVhcC50b3AoKTsKCQkJbWluX2hlYXAucG9wKCk7CgkJCW91dC5wdXNoX2JhY2sobik7CgkJfQoJCQoJCXJldHVybiBvdXQ7Cgl9Cn07Cgp2b2lkIHByaW50KHZlY3RvcjxVc2VyV2l0aFNjb3JlPiB0b3BfbikgewoJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3Bfbi5zaXplKCk7IGkrKykgewoJCWNvdXQgPDwgInVzZXI6ICIgPDwgdG9wX25baV0udXNlcl9pZCA8PCAiLCBzY29yZTogIiA8PCB0b3BfbltpXS5zY29yZSA8PCBlbmRsOwoJfQoJY291dCA8PCAnXG4nOwp9CgppbnQgbWFpbigpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCQoJR2FtZUxlYWRlckJvYXJkIGcxOwoJZzEuYWRkX3Njb3JlKCJnZXJhbGQiLCAxMCk7CglnMS5hZGRfc2NvcmUoInR1c2hhciIsIDIwKTsKCWcxLmFkZF9zY29yZSgiZ2F1cmF2IiwgMTUpOwoJZzEuYWRkX3Njb3JlKCJ2aXNoYWwiLCAzKTsKCXByaW50KGcxLmdldF90b3BfbigzKSk7CgkKCWcxLmFkZF9zY29yZSgiZ2VyYWxkIiwgMzApOwoJcHJpbnQoZzEuZ2V0X3RvcF9uKDMpKTsKCQoJcmV0dXJuIDA7Cn0=