/* T0: trade("MSFT", 400); T1: trade("IBM", 1000); T2: trade("AAPL", 500); T3: trade("AAPL", 600); T4: trade("NFLX", 1000); T5: trade("AMZN", 700); T6: trade("FB", 300); T7: topK(3) # -> AAPL|1100 NFLX|1000 IBM|1000 T8: trade("MSFT",1600) T9: topK(2) # -> MSFT|2000 AAPL|1100 ctrl + z ctrl = */ #include include using namespace std; class TradingVolumeTracker { protected: std::unordered_map stockToVolume; typedef pair VolumePair; set volumeSet; // name, size, time queue tradeQueue; int timeWindowSeconds{3600}; // secondsSince public: { void update(string name, uint64_t volume) { int time = getTime(); // in seconds stockToVolume.count(name) { uint64_t oldVol= stockToVolume[name]; volumeSet.erase({oldVolume, name}); } // update trade queue FIFO tradeQueue.push({name,volume,time}); stockToVolume[name]+=volume; volumeSet.insert({stockToVolume[name],volume}}); } void getTopK(int k) { // evict old trade // int now = getTime(); while (get<2>(tradeQueue.top() < now - timeWindowSeconds) { tradeQueue.pop(); } auto iter = volumeSet.begin(); for (i = 0; i < k; && iter != volumeSet.end(); ++i, ++iter) { cout << iter->second << "|" << iter->first << end; } } };