# leetcode\_981

Create a timebased key-value store class TimeMap, that supports two operations.

1. set(string key, string value, int timestamp)

Stores the key and value, along with the given timestamp. 2. get(string key, int timestamp)

Returns a value such that set(key, value, timestamp\_prev) was called previously, with timestamp\_prev <= timestamp. If there are multiple such values, it returns the one with the largest timestamp\_prev. If there are no values, it returns the empty string ("").

Example 1:

Input: inputs = \["TimeMap","set","get","get","set","get","get"], inputs = \[\[],\["foo","bar",1],\["foo",1],\["foo",3],\["foo","bar2",4],\["foo",4],\["foo",5]] Output: \[null,null,"bar","bar",null,"bar2","bar2"] Explanation:\
TimeMap kv;\
kv.set("foo", "bar", 1); // store the key "foo" and value "bar" along with timestamp = 1\
kv.get("foo", 1); // output "bar"\
kv.get("foo", 3); // output "bar" since there is no value corresponding to foo at timestamp 3 and timestamp 2, then the only value is at timestamp 1 ie "bar"\
kv.set("foo", "bar2", 4);\
kv.get("foo", 4); // output "bar2"\
kv.get("foo", 5); //output "bar2"

Example 2:

Input: inputs = \["TimeMap","set","set","get","get","get","get","get"], inputs = \[\[],\["love","high",10],\["love","low",20],\["love",5],\["love",10],\["love",15],\["love",20],\["love",25]] Output: \[null,null,null,"","high","high","low","low"]

Note:

All key/value strings are lowercase. All key/value strings have length in the range \[1, 100] The timestamps for all TimeMap.set operations are strictly increasing. 1 <= timestamp <= 10^7 TimeMap.set and TimeMap.get functions will be called a total of 120000 times (combined) per test case.

## Solutions

1. **hashmap and treemap**

```cpp
class TimeMap {
public:
    unordered_map<string, map<int, string>> m;
    /** Initialize your data structure here. */
    TimeMap() {

    }

    void set(string key, string value, int timestamp) {
        m[key][timestamp] = value;
    }

    string get(string key, int timestamp) {
        if (!m.count(key)) return "";
        auto find = m[key].upper_bound(timestamp);
        return find == m[key].begin() ? "" : prev(find)->second;
    }
};

/**
 * Your TimeMap object will be instantiated and called as such:
 * TimeMap* obj = new TimeMap();
 * obj->set(key,value,timestamp);
 * string param_2 = obj->get(key,timestamp);
 */
```

1. **hashmap with binary search**
2. The problem ensures that timestamps of set operations are in increasing order.

```cpp
class TimeMap {
public:
    unordered_map<string, vector<pair<int, string>>> m;
    /** Initialize your data structure here. */
    TimeMap() {

    }

    void set(string key, string value, int timestamp) {
        m[key].emplace_back(timestamp, value);
    }

    string get(string key, int timestamp) {
        if (!m.count(key)) return "";
        pair<int, string> target {timestamp, key};
        auto find = upper_bound(m[key].begin(), m[key].end(), target, 
            [&](auto & p1, auto & p2) { return p1.first < p2.first; });
        return find == m[key].begin() ? "" : prev(find)->second;
    }
};
```
