classAllOne{private:classNode{public:
string str;int num;Node(string s,int n){
str = s;
num = n;}friendbooloperator<(const Node &a,const Node &b){if(a.num != b.num)return a.num < b.num;elsereturn a.str < b.str;}friendbooloperator>(const Node &a,const Node &b){if(a.num != b.num)return a.num > b.num;elsereturn a.str > b.str;}friendbooloperator==(const Node &a,const Node &b){return a.num == b.num && a.str == b.str;}};
unordered_map<string,int> ump;
set<Node> st;
unordered_map<string, set<Node>::iterator> stump;public:/** Initialize your data structure here. */AllOne(){}/** Inserts a new key <Key> with value 1. Or increments an existing key by 1. */voidinc(string key){if(ump.find(key)== ump.end())
ump.insert(pair(key,1));else{
ump[key]++;
st.erase(stump[key]);
stump.erase(key);}auto iter = st.insert(Node(key, ump[key]));
stump[key]= iter.first;}/** Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. */voiddec(string key){if(ump.find(key)!= ump.end()){if(ump[key]==1){
ump.erase(key);
st.erase(stump[key]);
stump.erase(key);}else{
ump[key]--;
st.erase(stump[key]);
stump.erase(key);auto iter = st.insert(Node(key, ump[key]));
stump[key]= iter.first;}}}/** Returns one of the keys with maximal value. */
string getMaxKey(){if(ump.empty())return"";return(--st.end())->str;}/** Returns one of the keys with Minimal value. */
string getMinKey(){if(ump.empty())return"";return st.begin()->str;}};