#include<bits/stdc++.h>
using namespace std;
void increase(int contentId, unordered_map<int, int> &contentIdToPop, map<int, set<int>> &popToContentIdList) {
if(contentIdToPop.find(contentId) != contentIdToPop.end()) {
int oldPop = contentIdToPop[contentId];
popToContentIdList[oldPop].erase(contentId);
if (popToContentIdList[oldPop].empty()) {
popToContentIdList.erase(oldPop);
}
int newPop = oldPop + 1;
contentIdToPop[contentId] = newPop;
popToContentIdList[newPop].insert(contentId);
} else {
int newPop = 1;
contentIdToPop[contentId] = newPop;
popToContentIdList[newPop].insert(contentId);
}
}
void decrease(int contentId, unordered_map<int, int> &contentIdToPop, map<int, set<int>> &popToContentIdList) {
if(contentIdToPop.find(contentId) != contentIdToPop.end()) {
int oldPop = contentIdToPop[contentId];
popToContentIdList[oldPop].erase(contentId);
if (popToContentIdList[oldPop].empty()) {
popToContentIdList.erase(oldPop);
}
int newPop = oldPop - 1;
if(newPop == 0) {
contentIdToPop.erase(contentId);
} else {
contentIdToPop[contentId] = newPop;
popToContentIdList[newPop].insert(contentId);
}
} else {
cout<<"Content Id not found"<<endl;
}
}
int getMostPopular(map<int, set<int>> popToContentIdList) {
if(popToContentIdList.empty()) {
return -1;
}
set<int> mostPopularContent = popToContentIdList.rbegin()->second;
// all content Ids are most popular in this set, so return any one, for tie breaking , can return first element or last element
return *mostPopularContent.begin();
}
int main() {
unordered_map<int, int> contentIdToPop;
map<int, set<int>> popToContentIdList;
increase(7, contentIdToPop, popToContentIdList); // 7->1 1->(7,)
increase(7, contentIdToPop, popToContentIdList); // 7->2 2->(7,)
increase(8, contentIdToPop, popToContentIdList); // 7->2, 8->1 1->(8,) , 2->(7,)
cout<<getMostPopular(popToContentIdList)<<endl; // Ans = 7
increase(8, contentIdToPop, popToContentIdList); // 7->2, 8->2 2->(7,8,)
increase(8, contentIdToPop, popToContentIdList); // 7->2, 8->3 2->(7,) , 3->(8,)
cout<<getMostPopular(popToContentIdList)<<endl; // Ans = 8
decrease(8, contentIdToPop, popToContentIdList); // 7->2, 8->2 2->(7,8,)
decrease(8, contentIdToPop, popToContentIdList); // 7->2, 8->1 1->(8,) , 2->(7,)
cout<<getMostPopular(popToContentIdList)<<endl; // Ans = 7
decrease(7, contentIdToPop, popToContentIdList); // 7->1, 8->1 1->(7,8,)
decrease(7, contentIdToPop, popToContentIdList); // 8->1 1->(8,)
decrease(8, contentIdToPop, popToContentIdList); // empty empty
cout<<getMostPopular(popToContentIdList)<<endl; // Ans = -1
increase(7, contentIdToPop, popToContentIdList); // 7->1 1->(7,)
cout<<getMostPopular(popToContentIdList)<<endl; // Ans = 7
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgaW5jcmVhc2UoaW50IGNvbnRlbnRJZCwgdW5vcmRlcmVkX21hcDxpbnQsIGludD4gJmNvbnRlbnRJZFRvUG9wLCBtYXA8aW50LCBzZXQ8aW50Pj4gJnBvcFRvQ29udGVudElkTGlzdCkgewoKICAgICAgICBpZihjb250ZW50SWRUb1BvcC5maW5kKGNvbnRlbnRJZCkgIT0gY29udGVudElkVG9Qb3AuZW5kKCkpIHsKCiAgICAgICAgICAgIGludCBvbGRQb3AgPSBjb250ZW50SWRUb1BvcFtjb250ZW50SWRdOwogICAgICAgICAgICBwb3BUb0NvbnRlbnRJZExpc3Rbb2xkUG9wXS5lcmFzZShjb250ZW50SWQpOwogICAgICAgICAgICBpZiAocG9wVG9Db250ZW50SWRMaXN0W29sZFBvcF0uZW1wdHkoKSkgewogICAgICAgICAgICAgICAgcG9wVG9Db250ZW50SWRMaXN0LmVyYXNlKG9sZFBvcCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBuZXdQb3AgPSBvbGRQb3AgKyAxOwogICAgICAgICAgICBjb250ZW50SWRUb1BvcFtjb250ZW50SWRdID0gbmV3UG9wOwogICAgICAgICAgICBwb3BUb0NvbnRlbnRJZExpc3RbbmV3UG9wXS5pbnNlcnQoY29udGVudElkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgbmV3UG9wID0gMTsKICAgICAgICAgICAgY29udGVudElkVG9Qb3BbY29udGVudElkXSA9IG5ld1BvcDsKICAgICAgICAgICAgcG9wVG9Db250ZW50SWRMaXN0W25ld1BvcF0uaW5zZXJ0KGNvbnRlbnRJZCk7CiAgICAgICAgfQp9Cgp2b2lkIGRlY3JlYXNlKGludCBjb250ZW50SWQsIHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+ICZjb250ZW50SWRUb1BvcCwgbWFwPGludCwgc2V0PGludD4+ICZwb3BUb0NvbnRlbnRJZExpc3QpIHsKCiAgICAgICAgaWYoY29udGVudElkVG9Qb3AuZmluZChjb250ZW50SWQpICE9IGNvbnRlbnRJZFRvUG9wLmVuZCgpKSB7CgogICAgICAgICAgICBpbnQgb2xkUG9wID0gY29udGVudElkVG9Qb3BbY29udGVudElkXTsKICAgICAgICAgICAgcG9wVG9Db250ZW50SWRMaXN0W29sZFBvcF0uZXJhc2UoY29udGVudElkKTsKICAgICAgICAgICAgaWYgKHBvcFRvQ29udGVudElkTGlzdFtvbGRQb3BdLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHBvcFRvQ29udGVudElkTGlzdC5lcmFzZShvbGRQb3ApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnQgbmV3UG9wID0gb2xkUG9wIC0gMTsKICAgICAgICAgICAgaWYobmV3UG9wID09IDApIHsKICAgICAgICAgICAgICAgIGNvbnRlbnRJZFRvUG9wLmVyYXNlKGNvbnRlbnRJZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb250ZW50SWRUb1BvcFtjb250ZW50SWRdID0gbmV3UG9wOwogICAgICAgICAgICAgICAgcG9wVG9Db250ZW50SWRMaXN0W25ld1BvcF0uaW5zZXJ0KGNvbnRlbnRJZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY291dDw8IkNvbnRlbnQgSWQgbm90IGZvdW5kIjw8ZW5kbDsKICAgICAgICB9Cn0KCmludCBnZXRNb3N0UG9wdWxhcihtYXA8aW50LCBzZXQ8aW50Pj4gcG9wVG9Db250ZW50SWRMaXN0KSB7CiAgICBpZihwb3BUb0NvbnRlbnRJZExpc3QuZW1wdHkoKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHNldDxpbnQ+IG1vc3RQb3B1bGFyQ29udGVudCA9IHBvcFRvQ29udGVudElkTGlzdC5yYmVnaW4oKS0+c2Vjb25kOyAKCiAgICAvLyBhbGwgY29udGVudCBJZHMgYXJlIG1vc3QgcG9wdWxhciBpbiB0aGlzIHNldCwgc28gcmV0dXJuIGFueSBvbmUsIGZvciB0aWUgYnJlYWtpbmcgLCBjYW4gcmV0dXJuIGZpcnN0IGVsZW1lbnQgb3IgbGFzdCBlbGVtZW50CiAgICByZXR1cm4gKm1vc3RQb3B1bGFyQ29udGVudC5iZWdpbigpOwp9CgppbnQgbWFpbigpIHsKCgogICAgdW5vcmRlcmVkX21hcDxpbnQsIGludD4gY29udGVudElkVG9Qb3A7CiAgICBtYXA8aW50LCBzZXQ8aW50Pj4gcG9wVG9Db250ZW50SWRMaXN0OwoKICAgIGluY3JlYXNlKDcsIGNvbnRlbnRJZFRvUG9wLCBwb3BUb0NvbnRlbnRJZExpc3QpOyAgLy8gIDctPjEgICAgICAgICAgICAgICAgICAgMS0+KDcsKQogICAgaW5jcmVhc2UoNywgY29udGVudElkVG9Qb3AsIHBvcFRvQ29udGVudElkTGlzdCk7ICAvLyAgNy0+MiAgICAgICAgICAgICAgICAgICAyLT4oNywpCiAgICBpbmNyZWFzZSg4LCBjb250ZW50SWRUb1BvcCwgcG9wVG9Db250ZW50SWRMaXN0KTsgIC8vICA3LT4yLCA4LT4xICAgICAgICAgICAgIDEtPig4LCkgLCAyLT4oNywpCiAgICBjb3V0PDxnZXRNb3N0UG9wdWxhcihwb3BUb0NvbnRlbnRJZExpc3QpPDxlbmRsOyAgLy8gQW5zID0gNyAgICAgICAgICAgICAgIAoKCiAgICBpbmNyZWFzZSg4LCBjb250ZW50SWRUb1BvcCwgcG9wVG9Db250ZW50SWRMaXN0KTsgICAvLyA3LT4yLCA4LT4yICAgICAgICAgICAgICAgMi0+KDcsOCwpCiAgICBpbmNyZWFzZSg4LCBjb250ZW50SWRUb1BvcCwgcG9wVG9Db250ZW50SWRMaXN0KTsgICAvLyA3LT4yLCA4LT4zICAgICAgICAgICAgICAgMi0+KDcsKSAsIDMtPig4LCkKICAgIGNvdXQ8PGdldE1vc3RQb3B1bGFyKHBvcFRvQ29udGVudElkTGlzdCk8PGVuZGw7ICAgLy8gQW5zID0gOAoKICAgIGRlY3JlYXNlKDgsIGNvbnRlbnRJZFRvUG9wLCBwb3BUb0NvbnRlbnRJZExpc3QpOyAgIC8vIDctPjIsIDgtPjIgICAgICAgICAgICAgICAyLT4oNyw4LCkKICAgIGRlY3JlYXNlKDgsIGNvbnRlbnRJZFRvUG9wLCBwb3BUb0NvbnRlbnRJZExpc3QpOyAgIC8vIDctPjIsIDgtPjEgICAgICAgICAgICAgICAxLT4oOCwpICwgMi0+KDcsKQogICAgY291dDw8Z2V0TW9zdFBvcHVsYXIocG9wVG9Db250ZW50SWRMaXN0KTw8ZW5kbDsgICAvLyBBbnMgPSA3CgogICAgZGVjcmVhc2UoNywgY29udGVudElkVG9Qb3AsIHBvcFRvQ29udGVudElkTGlzdCk7ICAvLyA3LT4xLCA4LT4xICAgICAgICAgICAgICAgIDEtPig3LDgsKQogICAgZGVjcmVhc2UoNywgY29udGVudElkVG9Qb3AsIHBvcFRvQ29udGVudElkTGlzdCk7ICAvLyA4LT4xICAgICAgICAgICAgICAgICAgICAgIDEtPig4LCkKICAgIGRlY3JlYXNlKDgsIGNvbnRlbnRJZFRvUG9wLCBwb3BUb0NvbnRlbnRJZExpc3QpOyAgIC8vIGVtcHR5ICAgICAgICAgICAgICAgICAgICAgZW1wdHkKICAgIGNvdXQ8PGdldE1vc3RQb3B1bGFyKHBvcFRvQ29udGVudElkTGlzdCk8PGVuZGw7ICAgLy8gQW5zID0gLTEKCiAgICBpbmNyZWFzZSg3LCBjb250ZW50SWRUb1BvcCwgcG9wVG9Db250ZW50SWRMaXN0KTsgIC8vICA3LT4xICAgICAgICAgICAgICAgICAgICAgMS0+KDcsKQogICAgY291dDw8Z2V0TW9zdFBvcHVsYXIocG9wVG9Db250ZW50SWRMaXN0KTw8ZW5kbDsgIC8vIEFucyA9IDcgCgogICAKICAKICAgIHJldHVybiAwOwogICAgCn0=