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