← Home
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))
}