#include<bits/stdc++.h>
using namespace std;
void upsertCommodityPrice( int time , int price, unordered_map< int , int > & timeToPrice, map< int , set< int >> & priceToTimeList) {
if ( timeToPrice.find ( time ) ! = timeToPrice.end ( ) ) {
int oldPrice = timeToPrice[ time ] ;
priceToTimeList[ oldPrice] .erase ( time ) ;
if ( priceToTimeList[ oldPrice] .empty ( ) ) {
priceToTimeList.erase ( oldPrice) ;
}
timeToPrice[ time ] = price;
priceToTimeList[ price] .insert ( time ) ;
} else {
timeToPrice[ time ] = price;
priceToTimeList[ price] .insert ( time ) ;
}
}
int getMaxPrice( map< int , set< int >> priceToTimeList) {
return priceToTimeList.empty ( ) ? - 1 : priceToTimeList.rbegin ( ) - > first; // // Map is sorted on basis of keys in ascening order, so max entry will be last entry and we need key of last entry not value
}
int main( ) {
unordered_map< int , int > timeToPrice;
map< int , set< int >> priceToTimeList;
upsertCommodityPrice( 4 , 27 , timeToPrice, priceToTimeList) ; // 4->27 27->(4,)
upsertCommodityPrice( 6 , 26 , timeToPrice, priceToTimeList) ; // 4->27 , 6->26 26->(6,) , 27->(4,)
upsertCommodityPrice( 9 , 25 , timeToPrice, priceToTimeList) ; // 4->27 , 6->26, 9->25 25->(9) , 26->(6,), 27->(4,)
cout << getMaxPrice( priceToTimeList) << endl; // Ans - 27
upsertCommodityPrice( 4 , 24 , timeToPrice, priceToTimeList) ; // 4->24 , 6->26, 9->25 24->(4,) , 25->(9,) , 26->(6,)
cout << getMaxPrice( priceToTimeList) << endl; // Ans - 26
upsertCommodityPrice( 6 , 21 , timeToPrice, priceToTimeList) ; // 4->24 , 6->21, 9->25 21->(6,) 24->(4,) , 25->(9,)
cout << getMaxPrice( priceToTimeList) << endl; // Ans - 25
upsertCommodityPrice( 4 , 21 , timeToPrice, priceToTimeList) ; // 4->21 , 6->21, 9->25 21->(6,4,) , 25->(9,)
cout << getMaxPrice( priceToTimeList) << endl; // Ans - 25
upsertCommodityPrice( 9 , 15 , timeToPrice, priceToTimeList) ; // 4->21 , 6->21, 9->15 15->(9,) , 21->(6,4,)
cout << getMaxPrice( priceToTimeList) << endl; // Ans - 21
// Lets say you want to print the timestamps only , when price was max , 21 is max price at time 4 and 6. So there is tie
// tie breaker - 4 should be printed first or 6 ?
// we are using set , so result is sorted first 4 then 6
// if we want to print 4 and then 6 , then iterate from first to last
set< int > maxTimes = priceToTimeList.rbegin ( ) - > second;
for ( auto it = maxTimes.begin ( ) ; it ! = maxTimes.end ( ) ; it++ ) {
cout << * it<< " " ;
}
cout << endl;
// if we want to print 6 and then 4 , then iterate from last to first , use rbegin() which points to last element
for ( auto it = maxTimes.rbegin ( ) ; it ! = maxTimes.rend ( ) ; it++ ) {
cout << * it<< " " ;
}
return 0 ;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgdXBzZXJ0Q29tbW9kaXR5UHJpY2UoaW50IHRpbWUsIGludCBwcmljZSwgdW5vcmRlcmVkX21hcDxpbnQsIGludD4gJnRpbWVUb1ByaWNlLCBtYXA8aW50LCBzZXQ8aW50Pj4gJnByaWNlVG9UaW1lTGlzdCkgewoKICAgICAgICBpZih0aW1lVG9QcmljZS5maW5kKHRpbWUpICE9IHRpbWVUb1ByaWNlLmVuZCgpKSB7CgogICAgICAgICAgICBpbnQgb2xkUHJpY2UgPSB0aW1lVG9QcmljZVt0aW1lXTsKICAgICAgICAgICAgcHJpY2VUb1RpbWVMaXN0W29sZFByaWNlXS5lcmFzZSh0aW1lKTsKICAgICAgICAgICAgaWYgKHByaWNlVG9UaW1lTGlzdFtvbGRQcmljZV0uZW1wdHkoKSkgewogICAgICAgICAgICAgICAgcHJpY2VUb1RpbWVMaXN0LmVyYXNlKG9sZFByaWNlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGltZVRvUHJpY2VbdGltZV0gPSBwcmljZTsKICAgICAgICAgICAgcHJpY2VUb1RpbWVMaXN0W3ByaWNlXS5pbnNlcnQodGltZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGltZVRvUHJpY2VbdGltZV0gPSBwcmljZTsKICAgICAgICAgICAgcHJpY2VUb1RpbWVMaXN0W3ByaWNlXS5pbnNlcnQodGltZSk7CiAgICAgICAgfQp9CgppbnQgZ2V0TWF4UHJpY2UobWFwPGludCwgc2V0PGludD4+IHByaWNlVG9UaW1lTGlzdCkgewogICAgcmV0dXJuIHByaWNlVG9UaW1lTGlzdC5lbXB0eSgpID8gLTEgOiBwcmljZVRvVGltZUxpc3QucmJlZ2luKCktPmZpcnN0OyAvLyAvLyBNYXAgaXMgc29ydGVkIG9uIGJhc2lzIG9mIGtleXMgaW4gYXNjZW5pbmcgb3JkZXIsIHNvIG1heCBlbnRyeSB3aWxsIGJlIGxhc3QgZW50cnkgYW5kIHdlIG5lZWQga2V5IG9mIGxhc3QgZW50cnkgbm90IHZhbHVlCn0KCmludCBtYWluKCkgewoKCiAgICB1bm9yZGVyZWRfbWFwPGludCwgaW50PiB0aW1lVG9QcmljZTsKICAgIG1hcDxpbnQsIHNldDxpbnQ+PiBwcmljZVRvVGltZUxpc3Q7CgogICAgdXBzZXJ0Q29tbW9kaXR5UHJpY2UoNCwgMjcsIHRpbWVUb1ByaWNlLCBwcmljZVRvVGltZUxpc3QpOyAgIC8vIDQtPjI3ICAgICAgICAgICAgICAgICAgICAgICAyNy0+KDQsKQogICAgdXBzZXJ0Q29tbW9kaXR5UHJpY2UoNiwgMjYsIHRpbWVUb1ByaWNlLCBwcmljZVRvVGltZUxpc3QpOyAgIC8vIDQtPjI3ICwgNi0+MjYgICAgICAgICAgICAgICAyNi0+KDYsKSAsIDI3LT4oNCwpIAogICAgdXBzZXJ0Q29tbW9kaXR5UHJpY2UoOSwgMjUsIHRpbWVUb1ByaWNlLCBwcmljZVRvVGltZUxpc3QpOyAgIC8vIDQtPjI3ICwgNi0+MjYsIDktPjI1ICAgICAgICAyNS0+KDkpICwgMjYtPig2LCksIDI3LT4oNCwpCiAgICBjb3V0PDxnZXRNYXhQcmljZShwcmljZVRvVGltZUxpc3QpPDxlbmRsOyAgICAgICAgIC8vIEFucyAtIDI3CgogICAgdXBzZXJ0Q29tbW9kaXR5UHJpY2UoNCwgMjQsIHRpbWVUb1ByaWNlLCBwcmljZVRvVGltZUxpc3QpOyAgLy8gNC0+MjQgLCA2LT4yNiwgOS0+MjUgICAgICAgICAyNC0+KDQsKSAsIDI1LT4oOSwpICwgMjYtPig2LCkKICAgIGNvdXQ8PGdldE1heFByaWNlKHByaWNlVG9UaW1lTGlzdCk8PGVuZGw7ICAgIC8vIEFucyAtIDI2CgogICAgdXBzZXJ0Q29tbW9kaXR5UHJpY2UoNiwgMjEsIHRpbWVUb1ByaWNlLCBwcmljZVRvVGltZUxpc3QpOyAvLyA0LT4yNCAsIDYtPjIxLCA5LT4yNSAgICAgICAgICAgMjEtPig2LCkgMjQtPig0LCkgLCAyNS0+KDksKQogICAgY291dDw8Z2V0TWF4UHJpY2UocHJpY2VUb1RpbWVMaXN0KTw8ZW5kbDsgICAgICAgLy8gQW5zIC0gMjUKCiAgICB1cHNlcnRDb21tb2RpdHlQcmljZSg0LCAyMSwgdGltZVRvUHJpY2UsIHByaWNlVG9UaW1lTGlzdCk7IC8vIDQtPjIxICwgNi0+MjEsIDktPjI1ICAgICAgICAgIDIxLT4oNiw0LCkgLCAyNS0+KDksKQogICAgY291dDw8Z2V0TWF4UHJpY2UocHJpY2VUb1RpbWVMaXN0KTw8ZW5kbDsgIC8vIEFucyAtIDI1CgogICAgdXBzZXJ0Q29tbW9kaXR5UHJpY2UoOSwgMTUsIHRpbWVUb1ByaWNlLCBwcmljZVRvVGltZUxpc3QpOyAvLyA0LT4yMSAsIDYtPjIxLCA5LT4xNSAgICAgICAgICAgMTUtPig5LCkgLCAyMS0+KDYsNCwpIAogICAgY291dDw8Z2V0TWF4UHJpY2UocHJpY2VUb1RpbWVMaXN0KTw8ZW5kbDsgIC8vIEFucyAtIDIxCgoKICAgIC8vIExldHMgc2F5IHlvdSB3YW50IHRvIHByaW50IHRoZSB0aW1lc3RhbXBzIG9ubHkgLCB3aGVuIHByaWNlIHdhcyBtYXggLCAyMSBpcyBtYXggcHJpY2UgYXQgdGltZSA0IGFuZCA2LiBTbyB0aGVyZSBpcyB0aWUKICAgICAvLyB0aWUgYnJlYWtlciAtIDQgc2hvdWxkIGJlIHByaW50ZWQgZmlyc3Qgb3IgNiA/CiAgICAgLy8gd2UgYXJlIHVzaW5nIHNldCAsIHNvIHJlc3VsdCBpcyBzb3J0ZWQgZmlyc3QgNCB0aGVuIDYgCiAgICAgLy8gaWYgd2Ugd2FudCB0byBwcmludCA0IGFuZCB0aGVuIDYgLCB0aGVuIGl0ZXJhdGUgZnJvbSBmaXJzdCB0byBsYXN0IAogICAgc2V0PGludD4gbWF4VGltZXMgPSBwcmljZVRvVGltZUxpc3QucmJlZ2luKCktPnNlY29uZDsgICAgICAgICAgCiAgICBmb3IoYXV0byBpdCA9IG1heFRpbWVzLmJlZ2luKCk7IGl0ICE9IG1heFRpbWVzLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgY291dDw8Kml0PDwgIiAiOwogICAgfQogICAgY291dDw8ZW5kbDsKCiAgICAgLy8gaWYgd2Ugd2FudCB0byBwcmludCA2IGFuZCB0aGVuIDQgLCB0aGVuIGl0ZXJhdGUgZnJvbSBsYXN0IHRvIGZpcnN0ICwgdXNlIHJiZWdpbigpIHdoaWNoIHBvaW50cyB0byBsYXN0IGVsZW1lbnQKICAgICBmb3IoYXV0byBpdCA9IG1heFRpbWVzLnJiZWdpbigpOyBpdCAhPSBtYXhUaW1lcy5yZW5kKCk7IGl0KyspIHsKICAgICAgICBjb3V0PDwqaXQ8PCAiICI7CiAgICB9CgogIAogICAgcmV0dXJuIDA7CiAgICAKfQ==