```go
package main
import (
"io"
"os"
"strconv"
)
func nextInt(data []byte, idx *int) int {
i := *idx
n := len(data)
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 countSort(keys []int32, m, maxKey int, cnt []int, ord []int32) {
for i := 0; i <= maxKey; i++ {
cnt[i] = 0
}
for i := 1; i <= m; i++ {
cnt[int(keys[i])]++
}
for i := 1; i <= maxKey; i++ {
cnt[i] += cnt[i-1]
}
for i := m; i >= 1; i-- {
k := int(keys[i])
ord[cnt[k]] = int32(i)
cnt[k]--
}
}
func add(bitCnt []int32, bitSum []int64, n, idx int, dsum int64) {
for idx <= n {
bitCnt[idx]++
bitSum[idx] += dsum
idx += idx & -idx
}
}
func prefix(bitCnt []int32, bitSum []int64, idx int) (int64, int64) {
var c int64
var s int64
for idx > 0 {
c += int64(bitCnt[idx])
s += bitSum[idx]
idx -= idx & -idx
}
return c, s
}
func main() {
data, _ := io.ReadAll(os.Stdin)
ptr := 0
n := nextInt(data, &ptr)
q := nextInt(data, &ptr)
left := make([]int32, n+1)
right := make([]int32, n+1)
stackIdx := make([]int32, n+1)
stackVal := make([]int32, n+1)
top := 0
for i := 1; i <= n; i++ {
x := int32(nextInt(data, &ptr))
var last int32
for top > 0 && stackVal[top-1] < x {
top--
last = stackIdx[top]
}
if top > 0 {
right[int(stackIdx[top-1])] = int32(i)
}
if last != 0 {
left[i] = last
}
stackIdx[top] = int32(i)
stackVal[top] = x
top++
}
root := stackIdx[0]
l := make([]int32, q+1)
r := make([]int32, q+1)
for i := 1; i <= q; i++ {
l[i] = int32(nextInt(data, &ptr))
}
for i := 1; i <= q; i++ {
r[i] = int32(nextInt(data, &ptr))
}
L := make([]int32, n+1)
R := make([]int32, n+1)
order := stackVal
top = 0
stackIdx[top] = root
top++
k := 0
for top > 0 {
top--
v := stackIdx[top]
order[k] = v
k++
vi := int(v)
if left[vi] != 0 {
stackIdx[top] = left[vi]
top++
}
if right[vi] != 0 {
stackIdx[top] = right[vi]
top++
}
}
for i := k - 1; i >= 0; i-- {
v := order[i]
vi := int(v)
lc := left[vi]
rc := right[vi]
if lc != 0 {
L[vi] = L[int(lc)]
} else {
L[vi] = v
}
if rc != 0 {
R[vi] = R[int(rc)]
} else {
R[vi] = v
}
}
ordN := make([]int32, n+1)
ordQ := make([]int32, q+1)
cnt := make([]int, n+1)
bitCnt := make([]int32, n+2)
bitSum := make([]int64, n+2)
ans := make([]int64, q+1)
countSort(L, n, n, cnt, ordN)
countSort(l, q, n, cnt, ordQ)
pn := n
for i := q; i >= 1; i-- {
id := int(ordQ[i])
li := int(l[id])
ri := int(r[id])
for pn > 0 {
node := int(ordN[pn])
if int(L[node]) <= li {
break
}
add(bitCnt, bitSum, n, node, int64(L[node]))
pn--
}
c1, s1 := prefix(bitCnt, bitSum, ri)
c0, s0 := prefix(bitCnt, bitSum, li-1)
c := c1 - c0
s := s1 - s0
length := int64(ri - li + 1)
ans[id] = length*length - (s - int64(li)*c)
}
for i := 1; i <= n; i++ {
bitCnt[i] = 0
bitSum[i] = 0
}
countSort(R, n, n, cnt, ordN)
countSort(r, q, n, cnt, ordQ)
pn = 1
for i := 1; i <= q; i++ {
id := int(ordQ[i])
li := int(l[id])
ri := int(r[id])
for pn <= n {
node := int(ordN[pn])
if int(R[node]) >= ri {
break
}
add(bitCnt, bitSum, n, node, int64(R[node]))
pn++
}
c1, s1 := prefix(bitCnt, bitSum, ri)
c0, s0 := prefix(bitCnt, bitSum, li-1)
c := c1 - c0
s := s1 - s0
ans[id] -= int64(ri)*c - s
}
out := make([]byte, 0, q*14+1)
for i := 1; i <= q; i++ {
out = strconv.AppendInt(out, ans[i], 10)
if i < q {
out = append(out, ' ')
}
}
out = append(out, '\n')
os.Stdout.Write(out)
}
```