class Solution {
public:
    /**
     * lru design
     * @param operators int整型vector<vector<>> the ops
     * @param k int整型 the k
     * @return int整型vector
     */
    map<int, int> cache;
    list<int> li;
    vector<int> ret;
    int len = 0;
    vector<int> LRU(vector<vector<int> >& operators, int k) {
        // write code here
        len = k;
        for (auto &ele : operators) {
            if (ele[0] == 1) {
                set(ele[1], ele[2]);
            } else {
                get(ele[1]);
            }
        }
        return ret;
    }
    void set(int k, int v) {
        auto iter = cache.find(k);
        if (iter != cache.end()) {
            li.remove(k);
            li.push_front(k);
            cache[k] = v;
        } else {
            if (cache.size() >= len) {
                cache.erase(cache.find(li.back()));
                li.pop_back();
            }
            li.push_front(k);
            cache[k] = v;
        }
    }
    void get(int k) {
        auto iter = cache.find(k);
        if (iter != cache.end()) {
            int v = iter->second;
            li.remove(k);
            li.push_front(k);
            ret.push_back(v);
        } else {
            ret.push_back(-1);
        }
    }
};