#include <list>
#include <unordered_map>
class LRUCache {
public :
const size_t capacity;
std:: list < int > lru;
std:: unordered_map < size_t , std:: list < int > :: iterator > cache;
std:: unordered_map < size_t , size_t > key_val_map;
LRUCache( const size_t capacity) : capacity( capacity) { }
int get( size_t key) {
if ( key_val_map.count ( key) == 0 ) {
return - 1 ;
}
make_most_recent( key) ;
return key_val_map[ key] ;
}
void put( size_t key, size_t value) {
if ( key_val_map.size ( ) == capacity && key_val_map.count ( key) == 0 ) {
pop( ) ;
}
make_most_recent( key) ;
key_val_map[ key] = value;
}
private :
void make_most_recent( size_t key) {
if ( key_val_map.count ( key) ) {
lru.erase ( cache[ key] ) ;
}
lru.push_front ( key) ;
cache[ key] = lru.begin ( ) ;
}
void pop( ) {
key_val_map.erase ( lru.back ( ) ) ;
cache.erase ( lru.back ( ) ) ;
lru.pop_back ( ) ;
}
} ;
I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgoKY2xhc3MgTFJVQ2FjaGUgewpwdWJsaWM6CiAgICBjb25zdCBzaXplX3QgY2FwYWNpdHk7CiAgICBzdGQ6Omxpc3Q8aW50PiBscnU7CiAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c2l6ZV90LCBzdGQ6Omxpc3Q8aW50Pjo6aXRlcmF0b3I+IGNhY2hlOwogICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc2l6ZV90PiBrZXlfdmFsX21hcDsKCiAgICBMUlVDYWNoZShjb25zdCBzaXplX3QgY2FwYWNpdHkpIDogY2FwYWNpdHkoY2FwYWNpdHkpIHt9CgogICAgaW50IGdldChzaXplX3Qga2V5KSB7CiAgICAgICAgaWYgKGtleV92YWxfbWFwLmNvdW50KGtleSkgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICBtYWtlX21vc3RfcmVjZW50KGtleSk7CiAgICAgICAgcmV0dXJuIGtleV92YWxfbWFwW2tleV07CiAgICB9CgogICAgdm9pZCBwdXQoc2l6ZV90IGtleSwgc2l6ZV90IHZhbHVlKSB7CiAgICAgICAgaWYgKGtleV92YWxfbWFwLnNpemUoKSA9PSBjYXBhY2l0eSAmJiBrZXlfdmFsX21hcC5jb3VudChrZXkpID09IDApIHsKICAgICAgICAgICAgcG9wKCk7CiAgICAgICAgfQoKICAgICAgICBtYWtlX21vc3RfcmVjZW50KGtleSk7CgogICAgICAgIGtleV92YWxfbWFwW2tleV0gPSB2YWx1ZTsKICAgIH0KCnByaXZhdGU6CiAgICB2b2lkIG1ha2VfbW9zdF9yZWNlbnQoc2l6ZV90IGtleSkgewogICAgICAgIGlmIChrZXlfdmFsX21hcC5jb3VudChrZXkpKSB7CiAgICAgICAgICAgIGxydS5lcmFzZShjYWNoZVtrZXldKTsKICAgICAgICB9CgogICAgICAgIGxydS5wdXNoX2Zyb250KGtleSk7CiAgICAgICAgY2FjaGVba2V5XSA9IGxydS5iZWdpbigpOwogICAgfQoKCiAgICB2b2lkIHBvcCgpIHsKICAgICAgICBrZXlfdmFsX21hcC5lcmFzZShscnUuYmFjaygpKTsKICAgICAgICBjYWNoZS5lcmFzZShscnUuYmFjaygpKTsKICAgICAgICBscnUucG9wX2JhY2soKTsKICAgIH0KfTs=