← Home
```go
package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"sort"
)

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n, t int
	fmt.Fscan(in, &n, &t)

	a := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &a[i])
	}

	type Query struct {
		l, r, idx int
	}

	queries := make([]Query, t)
	for i := 0; i < t; i++ {
		var l, r int
		fmt.Fscan(in, &l, &r)
		queries[i] = Query{l - 1, r - 1, i}
	}

	blockSize := int(math.Sqrt(float64(n)))
	if blockSize == 0 {
		blockSize = 1
	}

	sort.Slice(queries, func(i, j int) bool {
		blockI := queries[i].l / blockSize
		blockJ := queries[j].l / blockSize
		if blockI != blockJ {
			return blockI < blockJ
		}
		if blockI%2 == 0 {
			return queries[i].r < queries[j].r
		}
		return queries[i].r > queries[j].r
	})

	freq := make([]int, 1000001)
	ans := make([]int64, t)
	var curAns int64 = 0
	curL, curR := 0, -1

	add := func(pos int) {
		x := a[pos]
		c := freq[x]
		curAns += int64(2*c+1) * int64(x)
		freq[x]++
	}

	remove := func(pos int) {
		x := a[pos]
		c := freq[x]
		curAns -= int64(2*c-1) * int64(x)
		freq[x]--
	}

	for _, q := range queries {
		for curL > q.l {
			curL--
			add(curL)
		}
		for curR < q.r {
			curR++
			add(curR)
		}
		for curL < q.l {
			remove(curL)
			curL++
		}
		for curR > q.r {
			remove(curR)
			curR--
		}
		ans[q.idx] = curAns
	}

	for i := 0; i < t; i++ {
		fmt.Fprintln(out, ans[i])
	}
}
```