func nextGreaterElements(nums []int) []int {
	n := len(nums)
	next := make([]int, n)
	if n == 0 {
		return next
	}
	next[0] = -1
	for i := 1; i < n; i *= 2 {
		copy(next[i:], next[:i])
	}
	st := make([]int, 0)
	l := 0
	for i := 0; i < 2*n; i++ { // Keep a decreasing stack, and traversal for twice
		for l != 0 && nums[st[l-1]] < nums[i%n] {
			next[st[l-1]] = nums[i%n]
			st = st[:l-1]
			l--
		}
		st = append(st, i%n)
		l++
	}
	return next
}