package main

// Stack ...
type Stack []int

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

// Top ...
func (s Stack) Top() int {
	return s[len(s)-1]
}

// Empty ...
func (s Stack) Empty() bool {
	return len(s) == 0
}

// Push ...
func (s *Stack) Push(val interface{}) {
	*s = append(*s, val.(int))
}

// Pop ...
func (s *Stack) Pop() interface{} {
	top := s.Top()
	*s = (*s)[:len(*s)-1]
	return top
}

// Stack64 ...
type Stack64 []int64

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

// Top ...
func (s Stack64) Top() int64 {
	return s[len(s)-1]
}

// Empty ...
func (s Stack64) Empty() bool {
	return len(s) == 0
}

// Push ...
func (s *Stack64) Push(val interface{}) {
	*s = append(*s, val.(int64))
}

// Pop ...
func (s *Stack64) Pop() interface{} {
	top := s.Top()
	*s = (*s)[:len(*s)-1]
	return top
}