#include <bits/stdc++.h>
using namespace std;
struct node {
  long long int l;
  long long int r;
  long long int i;
};
bool myCmp(node& a, node& b) {
  if ((a.l / 1000) != (b.l / 1000)) return (a.l / 1000) < (b.l / 1000);
  return a.r < b.r;
}
long long int n;
long long int m;
long long int c = 0;
vector<long long int> counter(1000000 + 1, 0);
void add(long long num) {
  c = c + (2 * counter[num] + 1) * num;
  counter[num]++;
}
void del(long long num) {
  c = c - (2 * counter[num] - 1) * num;
  counter[num]--;
}
int main() {
  scanf("%lld %lld", &n, &m);
  vector<long long int> arr(n);
  vector<long long int> ans(m);
  vector<node> query(m);
  map<long long int, long long int> mp;
  for (long long int i = 0; i < n; i++) {
    scanf("%lld", &arr[i]);
  }
  for (long long int i = 0; i < m; i++) {
    scanf("%lld %lld", &query[i].l, &query[i].r);
    query[i].l--, query[i].r--, query[i].i = i;
  }
  sort(query.begin(), query.end(), myCmp);
  add(arr[0]);
  for (long long int i = 0, l = 0, r = 0; i < m; i++) {
    while (l < query[i].l) {
      del(arr[l]);
      l++;
    }
    while (l > query[i].l) {
      l--;
      add(arr[l]);
    }
    while (r < query[i].r) {
      r++;
      add(arr[r]);
    }
    while (r > query[i].r) {
      del(arr[r]);
      r--;
    }
    ans[query[i].i] = c;
  }
  for (long long int i = 0; i < m; i++) printf("%lld \n", ans[i]);
  return 0;
}
