```go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
const maxBuffer = 1024 * 1024
buf := make([]byte, maxBuffer)
scanner.Buffer(buf, maxBuffer)
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
a := make([]int, n)
for i := 0; i < n; i++ {
scanner.Scan()
val, _ := strconv.Atoi(scanner.Text())
a[i] = val
}
lMax := make([]int, n)
rMax := make([]int, n)
lMin := make([]int, n)
rMin := make([]int, n)
stack := make([]int, 0, n)
for i := 0; i < n; i++ {
for len(stack) > 0 && a[stack[len(stack)-1]] <= a[i] {
stack = stack[:len(stack)-1]
}
if len(stack) == 0 {
lMax[i] = -1
} else {
lMax[i] = stack[len(stack)-1]
}
stack = append(stack, i)
}
stack = stack[:0]
for i := n - 1; i >= 0; i-- {
for len(stack) > 0 && a[stack[len(stack)-1]] < a[i] {
stack = stack[:len(stack)-1]
}
if len(stack) == 0 {
rMax[i] = n
} else {
rMax[i] = stack[len(stack)-1]
}
stack = append(stack, i)
}
stack = stack[:0]
for i := 0; i < n; i++ {
for len(stack) > 0 && a[stack[len(stack)-1]] >= a[i] {
stack = stack[:len(stack)-1]
}
if len(stack) == 0 {
lMin[i] = -1
} else {
lMin[i] = stack[len(stack)-1]
}
stack = append(stack, i)
}
stack = stack[:0]
for i := n - 1; i >= 0; i-- {
for len(stack) > 0 && a[stack[len(stack)-1]] > a[i] {
stack = stack[:len(stack)-1]
}
if len(stack) == 0 {
rMin[i] = n
} else {
rMin[i] = stack[len(stack)-1]
}
stack = append(stack, i)
}
var ans int64
for i := 0; i < n; i++ {
countMax := int64(i - lMax[i]) * int64(rMax[i] - i)
countMin := int64(i - lMin[i]) * int64(rMin[i] - i)
ans += (countMax - countMin) * int64(a[i])
}
fmt.Println(ans)
}
```