package main

import "container/list"

type Solution struct {
	cap int
	lst *list.List
    cache map[int]*list.Element
}
type entry struct {
    key,value int
}

func Constructor(capacity int) Solution {
	return Solution{
        capacity,
        list.New(),
        map[int]*list.Element{},
    }
}

func (this *Solution) get(key int) int {
	e := this.cache[key]
    if e == nil {
        return -1
    }
    this.lst.MoveToFront(e)
    return e.Value.(entry).value
}

func (this *Solution) set(key, value int) {
	// write code here
    e:=this.cache[key]
    if e != nil {
        e.Value=entry{key,value}
        this.lst.MoveToFront(e)
        return
    }
    this.cache[key]=this.lst.PushFront(entry{key,value})
    if len(this.cache) > this.cap {
        delete(this.cache, this.lst.Remove(this.lst.Back()).(entry).key)
    }
}

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