← Home
package main

import (
	"fmt"
	"io"
	"os"
	"sort"
)

type pair struct {
	val int
	idx int
}

const M = 1000000007

func main() {
	buf, _ := io.ReadAll(os.Stdin)
	pos := 0
	readInt := func() int {
		for pos < len(buf) && (buf[pos] < '0' || buf[pos] > '9') && buf[pos] != '-' {
			pos++
		}
		if pos == len(buf) {
			return 0
		}
		sign := 1
		if buf[pos] == '-' {
			sign = -1
			pos++
		}
		res := 0
		for pos < len(buf) && buf[pos] >= '0' && buf[pos] <= '9' {
			res = res*10 + int(buf[pos]-'0')
			pos++
		}
		return res * sign
	}

	n := readInt()
	if n == 0 {
		return
	}

	a := make([]int, n+1)
	pairs := make([]pair, n)
	for i := 1; i <= n; i++ {
		a[i] = readInt()
		pairs[i-1] = pair{val: a[i], idx: i}
	}

	sort.Slice(pairs, func(i, j int) bool {
		return pairs[i].val < pairs[j].val
	})

	rank := make([]int, n+1)
	for i := 0; i < n; i++ {
		rank[pairs[i].idx] = i + 1
	}

	bit := make([]int64, n+1)
	add := func(idx int, val int64) {
		for idx <= n {
			bit[idx] = (bit[idx] + val) % M
			idx += idx & -idx
		}
	}
	query := func(idx int) int64 {
		var sum int64 = 0
		for idx > 0 {
			sum = (sum + bit[idx]) % M
			idx -= idx & -idx
		}
		return sum
	}

	sumLeft := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		sumLeft[i] = query(rank[i] - 1)
		add(rank[i], int64(i))
	}

	for i := 1; i <= n; i++ {
		bit[i] = 0
	}

	sumRight := make([]int64, n+1)
	for i := n; i >= 1; i-- {
		sumRight[i] = query(rank[i] - 1)
		add(rank[i], int64(n-i+1))
	}

	var ans int64 = 0
	for i := 1; i <= n; i++ {
		term1 := int64(i) * int64(n-i+1) % M
		term2 := int64(n-i+1) * sumLeft[i] % M
		term3 := int64(i) * sumRight[i] % M

		Ci := (term1 + term2 + term3) % M
		val := int64(a[i]) % M
		ans = (ans + val*Ci) % M
	}

	fmt.Println(ans)
}