func nextGreaterElement(n int) int {
	runes := []rune(strconv.Itoa(n))
	for n = len(runes) - 2; 0 <= n && runes[n+1] <= runes[n]; n-- {
	}
	if n == -1 {
		return n
	}
	i := len(runes) - 1
	for ; runes[i] <= runes[n]; i-- {
	}
	runes[n], runes[i] = runes[i], runes[n]
	for n, i = n+1, len(runes)-1; n < i; n, i = n+1, i-1 {
		runes[n], runes[i] = runes[i], runes[n]
	}
	n, _ = strconv.Atoi(string(runes))
	if math.MaxInt32 < n {
		return -1
	}
	return n
}