package main
import (
"io"
"os"
"strconv"
)
func nextInt(data []byte, idx *int) int {
n := len(data)
i := *idx
for i < n && (data[i] < '0' || data[i] > '9') {
i++
}
val := 0
for i < n && data[i] >= '0' && data[i] <= '9' {
val = val*10 + int(data[i]-'0')
i++
}
*idx = i
return val
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
n := nextInt(data, &idx)
a := make([]int, n)
for i := 0; i < n; i++ {
a[i] = nextInt(data, &idx)
}
stack := make([]int, n)
top := 0
var sumMax int64
for i := 0; i <= n; i++ {
for top > 0 && (i == n || a[stack[top-1]] <= a[i]) {
j := stack[top-1]
top--
k := -1
if top > 0 {
k = stack[top-1]
}
sumMax += int64(a[j]) * int64(j-k) * int64(i-j)
}
if i < n {
stack[top] = i
top++
}
}
top = 0
var sumMin int64
for i := 0; i <= n; i++ {
for top > 0 && (i == n || a[stack[top-1]] >= a[i]) {
j := stack[top-1]
top--
k := -1
if top > 0 {
k = stack[top-1]
}
sumMin += int64(a[j]) * int64(j-k) * int64(i-j)
}
if i < n {
stack[top] = i
top++
}
}
os.Stdout.WriteString(strconv.FormatInt(sumMax-sumMin, 10))
}