class LRUCache {
public:
list<pair<int,int>> q;
unordered_map<int,list<pair<int,int>>::iterator> m;
int cap;
LRUCache(int capacity) {
cap = capacity;
}
int get(int key) {
if (!m.count(key)) return -1;
auto it = m[key];
int val = it->second;
q.erase(it);
q.push_front({key,val});
m[key] = q.begin();
return val;
}
void put(int key, int value) {
if (m.count(key)) {
auto it = m[key];
q.erase(it);
q.push_front({key,value});
m[key] = q.begin();
return;
}
if (m.size() == cap) {
auto it = q.rbegin();
int delete_key = it->first;
q.pop_back();
m.erase(delete_key);
}
q.push_front({key,value});
m[key] = q.begin();
}
};
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.get(key);
* obj.put(key,value);
*/