type minHeap []int // Stores the length only

func (h minHeap) Len() int           { return len(h) }
func (h minHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h minHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *minHeap) Push(x interface{}) {
	*h = append(*h, x.(int))
}

func (h *minHeap) Pop() interface{} {
	l := len(*h)
	x := (*h)[l-1]
	*h = (*h)[0 : l-1]
	return x
}

var m map[int]*minHeap

func isPossible(nums []int) bool {
	m = make(map[int]*minHeap)
	for _, num := range nums {
		last := helper(num - 1)
		l := 0
		if last.Len() != 0 {
			l = heap.Pop(last).(int)
		}
		curr := helper(num)
		heap.Push(curr, l+1)
	}
	for _, v := range m {
		h := *v
		for _, l := range h {
			if l < 3 {
				return false
			}
		}
	}
	return true
}

func helper(num int) *minHeap {
	if h, ok := m[num]; ok {
		return h
	} else {
		var h minHeap
		m[num] = &h
		return &h
	}
}