using System;
using System.Collections.Generic;


public class Solution {

    Dictionary<int, Node> cache = new Dictionary<int, Node>();
    Node head = new Node(-1,-1);
    Node tail = new Node(-1,-1);
    int Capacity{get;}
    int Count => cache.Count;

    public class Node{
        public int key;
        public int value;
        public Node pre;
        public Node next;

        public Node(){}
        public Node(int key, int value){
            this.key = key;
            this.value = value;
        }
    }


    public Solution(int capacity) {
        Capacity = capacity;
        head.next = tail;
        tail.pre = head;
    }

    public int get(int key) {
        if(cache.TryGetValue(key, out Node node)){
            SetFirst(node);
            return node.value;
        }
        else return -1;
    }

    public void set(int key, int value) {
        if(cache.TryGetValue(key, out Node node)){
            SetFirst(node);
            node.value = value;
            return;
        }
        if(Count == Capacity){
            RemoveLast();
        }
        Add(key, value);
    }
    
    public void Remove(Node node){
        node.pre.next = node.next;
        node.next.pre = node.pre;
        node.pre = null;
        node.next = null;
    }
    public void SetFirst(Node node){
        node.pre.next = node.next;
        node.next.pre = node.pre;
        head.next.pre = node;
        node.pre = head;
        node.next = head.next;
        head.next = node;
    }
    public void Add(int key, int value){
        Node node = new Node(key, value);
        cache.Add(key, node);
        head.next.pre = node;
        node.pre = head;
        node.next = head.next;
        head.next = node;
        Console.WriteLine("add(key):" + key);
    }
    public void RemoveLast(){
        Node node = tail.pre;
        if(node != head){
            Console.WriteLine("remove(key):" + node.key);
            cache.Remove(node.key);
            Remove(node);
            return;
        }
        Console.WriteLine("cant remove the last : the count == 0!");
    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution solution = new Solution(capacity);
 * int output = solution.get(key);
 * solution.set(key,value);
 */