class FoodRatings {
public:
FoodRatings(vector<string>& foods, vector<string>& cuisines, vector<int>& ratings) {
const int n = foods.size();
for (int i = 0; i < n; ++i) {
n_[foods[i]] = cuisines[i];
m_[foods[i]] = c_[cuisines[i]].emplace(-ratings[i], foods[i]).first;
}
}
void changeRating(string food, int newRating) {
const string& cuisine = n_[food];
c_[cuisine].erase(m_[food]);
m_[food] = c_[cuisine].emplace(-newRating, food).first;
}
string highestRated(string cuisine) {
return begin(c_[cuisine])->second;
}
private:
unordered_map<string, set<pair<int, string>>> c_; // cuisine -> {{-rating, name}}
unordered_map<string, string> n_; // food -> cuisine
unordered_map<string, set<pair<int, string>>::iterator> m_; // food -> set iterator
};
/**
* Your FoodRatings object will be instantiated and called as such:
* FoodRatings* obj = new FoodRatings(foods, cuisines, ratings);
* obj->changeRating(food,newRating);
* string param_2 = obj->highestRated(cuisine);
*/