classAllOne{public:voidinc(stringkey){constautoit=keyToIterator.find(key);// doesn't find the keyif(it==cend(keyToIterator)){if(l.empty()||l.front().value>1)l.push_front({1,{key}});elsel.front().keys.insert(key);keyToIterator[key]=begin(l);return;}constautolit=it->second;// List iteratorautonit=next(lit);// Next iteratorif(nit==end(l)||nit->value>lit->value+1)nit=l.insert(nit,{lit->value+1,{key}});else// Nit->value == lit->value + 1nit->keys.insert(key);keyToIterator[key]=nit;// Reset the mapping// Remove the key in keys setlit->keys.erase(key);if(lit->keys.empty())l.erase(lit);}voiddec(stringkey){constautoit=keyToIterator.find(key);// doens't find the keyif(it==cend(keyToIterator))return;constautolit=it->second;// List iteratorif(lit->value==1){// No need to find prev iterator in this casekeyToIterator.erase(key);}else{autopit=prev(lit);// Prev iteratorif(lit==begin(l)||pit->value<lit->value-1)pit=l.insert(lit,{lit->value-1,{key}});else// Pit->value == lit-value - 1pit->keys.insert(key);keyToIterator[key]=pit;// Reset the mapping}// Remove the key in keys setlit->keys.erase(key);if(lit->keys.empty())l.erase(lit);}stringgetMaxKey(){returnl.empty()?"":*cbegin(l.back().keys);}stringgetMinKey(){returnl.empty()?"":*cbegin(l.front().keys);}private:structNode{intvalue;unordered_set<string>keys;};list<Node>l;unordered_map<string,list<Node>::iterator>keyToIterator;};