← Home
package main

import (
	"bufio"
	"os"
	"strconv"
)

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}

func (fs *FastScanner) nextInt() int {
	sign := 1
	v := 0
	c, err := fs.r.ReadByte()
	for (c < '0' || c > '9') && c != '-' {
		c, err = fs.r.ReadByte()
		if err != nil {
			return 0
		}
	}
	if c == '-' {
		sign = -1
		c, _ = fs.r.ReadByte()
	}
	for c >= '0' && c <= '9' {
		v = v*10 + int(c-'0')
		c2, err := fs.r.ReadByte()
		if err != nil {
			break
		}
		c = c2
	}
	return v * sign
}

type Fenwick struct {
	n     int
	b1, b2 []int64
}

func NewFenwick(n int) *Fenwick {
	return &Fenwick{
		n:  n,
		b1: make([]int64, n+2),
		b2: make([]int64, n+2),
	}
}

func (f *Fenwick) add(bit []int64, idx int, delta int64) {
	for idx <= f.n {
		bit[idx] += delta
		idx += idx & -idx
	}
}

func (f *Fenwick) sum(bit []int64, idx int) int64 {
	var res int64
	for idx > 0 {
		res += bit[idx]
		idx -= idx & -idx
	}
	return res
}

func (f *Fenwick) rangeAdd(l, r int, delta int64) {
	if delta == 0 || l > r {
		return
	}
	f.add(f.b1, l, delta)
	f.add(f.b1, r+1, -delta)
	f.add(f.b2, l, delta*int64(l-1))
	f.add(f.b2, r+1, -delta*int64(r))
}

func (f *Fenwick) prefixSum(idx int) int64 {
	if idx <= 0 {
		return 0
	}
	s1 := f.sum(f.b1, idx)
	s2 := f.sum(f.b2, idx)
	return s1*int64(idx) - s2
}

type Pair struct {
	l, idx int
}

type Block struct {
	L, R int
	val  int64
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	n := in.nextInt()
	c := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		c[i] = int64(in.nextInt())
	}
	q := in.nextInt()
	queriesByR := make([][]Pair, n+1)
	for i := 0; i < q; i++ {
		l := in.nextInt()
		r := in.nextInt()
		queriesByR[r] = append(queriesByR[r], Pair{l: l, idx: i})
	}

	ans := make([]int64, q)
	fw := NewFenwick(n)
	stack := make([]Block, 0)

	for t := 1; t <= n; t++ {
		x := c[t]
		start := t
		for len(stack) > 0 && stack[len(stack)-1].val <= x {
			b := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			delta := x - b.val
			if delta != 0 {
				fw.rangeAdd(b.L, b.R, delta)
			}
			start = b.L
		}
		stack = append(stack, Block{L: start, R: t, val: x})
		fw.rangeAdd(t, t, x)

		prefR := fw.prefixSum(t)
		for _, qu := range queriesByR[t] {
			l := qu.l
			ans[qu.idx] = prefR - fw.prefixSum(l-1)
		}
	}

	for i := 0; i < q; i++ {
		out.WriteString(strconv.FormatInt(ans[i], 10))
		out.WriteByte('\n')
	}
}