#
# lru design
# @param operators int整型二维数组 the ops
# @param k int整型 the k
# @return int整型一维数组
#

class ListNode:
    def __init__(self,key,value):
        self.key = key
        self.value = value
        self.pre = None
        self.next = None
    
    
    def __str__(self):
        if not self:
            return "None"
        return str((self.key,self.value)) + " --> " + str(self.next)
        
        
        
class Solution:
    def __init__(self):
        self.head = ListNode(-1,-1)
        self.tail = ListNode(-1,-1)
        self.head.next = self.tail
        self.tail.pre = self.head
        self.size = 0
        self.mark = {}
        
        
    def LRU(self , operators , k ):
        # write code here
        self.k = k
        res = []
        for operator in operators:
            if operator[0]==1:
                self.set(operator[1],operator[2])
#                 print(self.head)
            else:
                value = self.get(operator[1])
                res.append(value)
#                 print(self.head)
        return res
        
    def set(self,key,value):
        if not self.mark.get(key,None):
            node = ListNode(key,value)
            # insert node after head
            node.next = self.head.next
            node.pre = self.head 
            self.head.next.pre = node
            self.head.next = node
            self.mark[key] = node
            if self.size==self.k:
                # delete last node
                key_to_del = self.tail.pre.key
                node = self.tail.pre.pre
                node.next = self.tail
                self.tail.pre = node
                self.mark[key_to_del] = None
            else:
                self.size += 1
        else:
            # delete node
            node = self.mark.get(key)
            node.value = value
            pre_node = node.pre
            pre_node.next = node.next
            node.next.pre = pre_node
            # insert node after head
            node.next = self.head.next
            node.pre = self.head 
            self.head.next.pre = node
            self.head.next = node

    def get(self,key):
        if self.mark.get(key,None):
            #delete node
            node = self.mark.get(key)
            pre_node = node.pre
            pre_node.next = node.next
            node.next.pre = pre_node
            # insert node after head
            node.next = self.head.next
            node.pre = self.head 
            self.head.next.pre = node
            self.head.next = node
            # 
            return node.value
        else:
            return -1