9 10
6 2 3 1 4 8 5 9 8
3 9
6 6
9 9
9 9
9 9
2 3
3 9
3 8
6 9
5 6
 10 10
5 10 9 2 9 3 5 5 6 5
5 10
2 2
3 10
4 8
1 3
1 5
5 5
10 10
8 9
6 10
 8 10
100 100 100 100 100 100 100 100
1 8
2 8
3 8
4 8
5 8
6 8
7 8
8 8
1 1
1 5
 5 15
103 45 103 67 45
1 1
1 2
1 3
1 4
1 5
2 2
2 3
2 4
2 5
3 3
3 4
3 5
4 4
4 5
5 5
 1 1
1000000
1 1
 10 5
10 9 8 7 6 5 4 3 2 1
4 8
1 10
3 9
2 2
5 10
 9 10
5 3 10 2 4 8 7 5 1
6 9
1 8
3 3
2 7
3 5
4 6
9 9
8 8
1 9
5 6
 9 10
10 2 6 2 4 6 6 4 1
4 8
8 9
2 3
8 9
9 9
4 5
1 7
6 6
6 8
1 1
 20 8
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
4 15
1 2
2 20
7 7
13 18
7 7
3 19
3 8
 1 2
1
1 1
1 1
 8 10
5 7 3 1 4 2 1 1
5 7
3 8
2 7
4 8
4 5
2 8
4 6
1 2
4 7
3 5

54
8
8
8
8
5
54
30
46
12
 63
10
92
34
24
53
9
5
11
54
 6400
4900
3600
2500
1600
900
400
100
100
2500
 103
148
457
524
659
45
148
215
350
103
170
215
67
112
45
 1000000
 25
55
35
9
21
 21
54
10
34
16
14
1
5
55
12
 42
5
8
5
1
6
76
6
28
10
 108
3
281
1
27
1
209
27
 1
1
 7
18
20
15
5
25
7
12
10
8

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Solver {

	public static void main(String[] Args) throws NumberFormatException,
			IOException {
		new Solver().Run();
	}

	PrintWriter pw;
	StringTokenizer Stok;
	BufferedReader br;

	public String nextToken() throws IOException {
		while (Stok == null || !Stok.hasMoreTokens()) {
			Stok = new StringTokenizer(br.readLine());
		}
		return Stok.nextToken();
	}

	public int nextInt() throws NumberFormatException, IOException {
		return Integer.parseInt(nextToken());
	}

	public double nextDouble() throws NumberFormatException, IOException {
		return Double.parseDouble(nextToken());
	}

	public long nextLong() throws NumberFormatException, IOException {
		return Long.parseLong(nextToken());
	}

	class Query implements Comparable<Query> {

		int l, r;
		int numblock;
		long result;

		public Query(int al, int ar) {
			l = al;
			r = ar;
			result = 0;
			numblock = l / sqrt;
		}

		@Override
		public int compareTo(Query o) {
			if (numblock - o.numblock != 0)
				return numblock - o.numblock;
			return r - o.r;
		}

	}

	final int maxVal = (int) 1e6 + 10;
	int n;
	int sqrt;
	int kolq;
	int[] mas;
	Query[] qv, buf;
	int[] kolUsed;
	int[] blockNum;
	int curInd = 0;

	public void Run() throws NumberFormatException, IOException {
		//br = new BufferedReader(new FileReader("input.txt")); pw = new PrintWriter("output.txt");
		br=new BufferedReader(new InputStreamReader(System.in)); pw=new PrintWriter(new OutputStreamWriter(System.out));

		n = nextInt();
		sqrt = (int) Math.sqrt(n);
		kolq = nextInt();
		mas = new int[n];
		for (int i = 0; i < n; i++) {
			mas[i] = nextInt();
		}

		qv = new Query[kolq];
		buf = new Query[kolq];
		for (int i = 0; i < kolq; i++) {
			Query que = new Query(nextInt() - 1, nextInt() - 1);
			qv[i] = que;
			buf[i] = que;
		}
		Arrays.sort(buf);
		kolUsed = new int[maxVal];
		blockNum = new int[maxVal];
		Arrays.fill(blockNum, -1);
		for (int i = 0; i < (n / sqrt) + 1; i++) {
			procQueries(i);
		}

		for (int i = 0; i < kolq; i++) {
			pw.println(qv[i].result);
		}
		pw.flush();
		pw.close();
	}

	long changeVal(long result, int num, int curBlock, int change) {
		int oldVal = kolUsed[num];
		if (blockNum[num] != curBlock) {
			oldVal = 0;
			blockNum[num] = curBlock;
		}
		result = result + (long)num * (2L*oldVal*change + change*change);
		//result -= ((long) num * oldVal * oldVal);
		oldVal += change;
		//result += ((long) num * oldVal * oldVal);
		kolUsed[num] = oldVal;
		return result;
	}

	private void procQueries(int curBl) {
		long result = 0;
		int begin = (curBl + 1) * sqrt;
		int i1 = begin;
		int i2 = begin;
		for (; curInd < kolq && buf[curInd].numblock == curBl; curInd++) {
			if (buf[curInd].r < begin) {

				result=0;
				for (int i = buf[curInd].l; i <= buf[curInd].r; i++) {
					result = changeVal(result, mas[i], curBl, 1);
				}

				buf[curInd].result = result;

				for (int i = buf[curInd].l; i <= buf[curInd].r; i++) {
					kolUsed[mas[i]] = 0;
				}
				result=0;

			} else {
				// | i2>>>>>
				for (; i2 <= buf[curInd].r; i2++) {
					result = changeVal(result, mas[i2], curBl, 1);
				}
				
				if (i1<buf[curInd].l){
					for (; i1<buf[curInd].l; i1++){
						result = changeVal(result, mas[i1], curBl, -1);
					}
				} else
					if (buf[curInd].l<i1){
						for (; i1 - 1>=buf[curInd].l; i1--){
							result = changeVal(result, mas[i1-1], curBl, 1);
						}
					}
				
//				// i1>>>>>|
//				for (; i1 < begin; i1++) {
//					result = changeVal(result, mas[i1], curBl, -1);
//				}
//
//				// i1<<<<<|
//				for (; i1 - 1 >= buf[curInd].l; i1--) {
//					result = changeVal(result, mas[i1 - 1], curBl, 1);
//				}

				buf[curInd].result = result;
			}
		}
	}

}