2
private Map<String, List<Entry>> map;3
private final String NOT_FOUND = "";9
public void set(String key, String value, int timestamp) {10
List<Entry> entries = map.getOrDefault(key, new ArrayList<>());11
entries.add(new Entry(value, timestamp));12
map.put(key, entries);15
public String get(String key, int timestamp) {16
List<Entry> entries = map.get(key);17
if (entries == null) {20
return binarySearch(entries, timestamp);23
private String binarySearch(List<Entry> entries, int timestamp) {24
int lo = 0, hi = entries.size() - 1, mid = -1;27
// Base cases - if value is not set, return empty28
if (entries.get(lo).timestamp > timestamp) {31
// If timestamp is equal or greater, return the last value saved in map against this key, since32
// that will have the largest timestamp33
else if (entries.get(hi).timestamp <= timestamp) {34
return entries.get(hi).value;37
// Else apply binary search to get correct value39
mid = lo + (hi - lo) / 2;40
Entry entry = entries.get(mid);41
// System.out.println("mid: "+mid);42
if (entry.timestamp == timestamp) {45
// Save ans, and look for ans on right half to find greater timestamp46
else if (entry.timestamp < timestamp) {61
public Entry(String value, int timestamp) {63
this.timestamp = timestamp;