#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9;
int Unset(int a, int i) {
  int mask;
  mask = 1 << i;
  a = a & ~mask;
  return a;
}
template <class T>
inline T gcd(T a, T b) {
  return (b) == 0 ? (a) : gcd((b), ((a) % (b)));
}
template <class T>
inline T lcm(T a, T b) {
  return ((a) / gcd((a), (b)) * (b));
}
template <typename T>
string NumberToString(T Number) {
  ostringstream second;
  second << Number;
  return second.str();
}
int power(int x, int n) {
  if (n == 0)
    return 1;
  else if (n % 2 == 0) {
    int y = power(x, n / 2);
    return y * y;
  } else
    return x * power(x, n - 1);
}
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
int n, arr[200010], lim, freq[1000010];
struct data {
  int x, y, z;
};
bool cmp(data a, data b) {
  if (a.x / lim == b.x / lim) {
    return a.y < b.y;
  }
  return a.x / lim < b.x / lim;
}
data v1[200010];
long long sqr[1000010], ans[200010];
void pre() {
  memset((sqr), 0, sizeof(sqr));
  for (int A = 0; A < 1000010; A++) {
    sqr[A] = (long long)A * (long long)A;
  }
}
int main() {
  pre();
  int qu;
  scanf("%d %d", &n, &qu);
  memset((freq), 0, sizeof(freq));
  for (int A = 0; A < n; A++) {
    scanf("%d", &arr[A]);
  }
  lim = ceil(sqrt(n));
  data dd1;
  for (int A = 0; A < qu; A++) {
    int x, y;
    scanf("%d %d", &x, &y);
    x--;
    y--;
    dd1.x = x;
    dd1.y = y;
    dd1.z = A;
    v1[A] = dd1;
  }
  sort(v1, v1 + qu, cmp);
  int s = 0, e = 0;
  long long total = 0;
  freq[arr[0]]++;
  total = arr[0];
  for (int A = 0; A < qu; A++) {
    while (e < v1[A].y) {
      e++;
      freq[arr[e]]++;
      total +=
          ((sqr[freq[arr[e]]] - sqr[freq[arr[e]] - 1]) * (long long)arr[e]);
    }
    while (e > v1[A].y) {
      freq[arr[e]]--;
      total -=
          ((sqr[freq[arr[e]] + 1] - sqr[freq[arr[e]]]) * (long long)arr[e]);
      e--;
    }
    while (s < v1[A].x) {
      freq[arr[s]]--;
      total -=
          ((sqr[freq[arr[s]] + 1] - sqr[freq[arr[s]]]) * (long long)arr[s]);
      s++;
    }
    while (s > v1[A].x) {
      s--;
      freq[arr[s]]++;
      total +=
          ((sqr[freq[arr[s]]] - sqr[freq[arr[s]] - 1]) * (long long)arr[s]);
    }
    ans[v1[A].z] = total;
  }
  for (int A = 0; A < qu; A++) {
    printf("%lld\n", ans[A]);
  }
  return 0;
}
