#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 1000000007;
const int MOD2 = 998244353;
const ll INF = 1e18;
const int MX = 1000001; // check the limits, dummy
// Modular arithmetic utilities
ll modExp(ll base, ll power) {
if (power == 0) {
return 1;
} else {
ll cur = modExp(base, power / 2);
cur = (cur * cur) % MOD;
if (power % 2 == 1) cur = (cur * base) % MOD;
return cur;
}
}
ll inv(ll base) {
return modExp(base, MOD - 2);
}
ll mul(ll A, ll B) {
return (A * B) % MOD;
}
ll add(ll A, ll B) {
return (A + B) % MOD;
}
ll dvd(ll A, ll B) {
return mul(A, inv(B));
}
ll sub(ll A, ll B) {
return (A - B + MOD) % MOD;
}
ll* facs = new ll[MX];
ll* facInvs = new ll[MX];
ll choose(ll a, ll b) {
if (b > a || a < 0 || b < 0) return 0;
ll cur = facs[a];
cur = mul(cur, facInvs[b]);
cur = mul(cur, facInvs[a - b]);
return cur;
}
void initFacs() {
facs[0] = 1;
facInvs[0] = 1;
for (int i = 1; i < MX; i++) {
facs[i] = (facs[i - 1] * i) % MOD;
facInvs[i] = inv(facs[i]);
}
}
// --------------------
// Mo's Algorithm setup
// --------------------
// A Query stores [l, r] (0-indexed) and its original index
struct Query {
int l, r, idx, block;
};
// Comparator for sorting queries in Mo's order
bool mo_cmp(const Query& A, const Query& B) {
if (A.block != B.block)
return A.block < B.block;
return (A.block & 1) ? (A.r > B.r) : (A.r < B.r);
}
// Global / static variables for Mo's
static int BLOCK_SIZE;
vector<int> arr;
ll currentAnswer = 0;
// Example frequency array; adjust size if necessary
// If arr[i] can be up to 1e6, size it accordingly.
static const int MAXV = 1000001;
static int freq[MAXV];
void add(int pos) {
int x = arr[pos];
int prevcount = freq[x];
currentAnswer -= (prevcount * prevcount) * x;
freq[x] ++;
int newcount = freq[x];
currentAnswer += (newcount * newcount) * x;
}
// Remove element at position pos from the current window
void remove_(int pos) {
int x = arr[pos];
int prevcount = freq[x];
currentAnswer -= (prevcount * prevcount) * x;
freq[x] --;
int newcount = freq[x];
currentAnswer += (newcount * newcount) * x;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
initFacs(); // If you plan to use choose(), etc.
int n, m, k;
cin >> n >> m;
arr.resize(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
// Build queries
vector<Query> qs(m);
BLOCK_SIZE = static_cast<int>(sqrt(n));
for (int i = 0; i < m; i++) {
int l, r;
cin >> l >> r;
--l; --r; // convert to 0-based
qs[i] = {l, r, i, l / BLOCK_SIZE};
}
sort(qs.begin(), qs.end(), mo_cmp);
vector<ll> answers(m);
int currL = 0, currR = -1;
currentAnswer = 0;
memset(freq, 0, sizeof(freq));
for (auto& q : qs) {
int L = q.l;
int R = q.r;
while (currL > L) {
add(--currL);
}
while (currR < R) {
add(++currR);
}
while (currL < L) {
remove_(currL++);
}
while (currR > R) {
remove_(currR--);
}
answers[q.idx] = currentAnswer;
}
// Output answers in original order
for (int i = 0; i < m; i++) {
cout << answers[i] << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdXNpbmcgbGwgPSBsb25nIGxvbmc7CmNvbnN0IGludCBNT0QgPSAxMDAwMDAwMDA3Owpjb25zdCBpbnQgTU9EMiA9IDk5ODI0NDM1MzsKY29uc3QgbGwgSU5GID0gMWUxODsKY29uc3QgaW50IE1YID0gMTAwMDAwMTsgLy8gY2hlY2sgdGhlIGxpbWl0cywgZHVtbXkKCi8vIE1vZHVsYXIgYXJpdGhtZXRpYyB1dGlsaXRpZXMKbGwgbW9kRXhwKGxsIGJhc2UsIGxsIHBvd2VyKSB7CiAgICBpZiAocG93ZXIgPT0gMCkgewogICAgICAgIHJldHVybiAxOwogICAgfSBlbHNlIHsKICAgICAgICBsbCBjdXIgPSBtb2RFeHAoYmFzZSwgcG93ZXIgLyAyKTsKICAgICAgICBjdXIgPSAoY3VyICogY3VyKSAlIE1PRDsKICAgICAgICBpZiAocG93ZXIgJSAyID09IDEpIGN1ciA9IChjdXIgKiBiYXNlKSAlIE1PRDsKICAgICAgICByZXR1cm4gY3VyOwogICAgfQp9CgpsbCBpbnYobGwgYmFzZSkgewogICAgcmV0dXJuIG1vZEV4cChiYXNlLCBNT0QgLSAyKTsKfQoKbGwgbXVsKGxsIEEsIGxsIEIpIHsKICAgIHJldHVybiAoQSAqIEIpICUgTU9EOwp9CgpsbCBhZGQobGwgQSwgbGwgQikgewogICAgcmV0dXJuIChBICsgQikgJSBNT0Q7Cn0KCmxsIGR2ZChsbCBBLCBsbCBCKSB7CiAgICByZXR1cm4gbXVsKEEsIGludihCKSk7Cn0KCmxsIHN1YihsbCBBLCBsbCBCKSB7CiAgICByZXR1cm4gKEEgLSBCICsgTU9EKSAlIE1PRDsKfQoKbGwqIGZhY3MgPSBuZXcgbGxbTVhdOwpsbCogZmFjSW52cyA9IG5ldyBsbFtNWF07CgpsbCBjaG9vc2UobGwgYSwgbGwgYikgewogICAgaWYgKGIgPiBhIHx8IGEgPCAwIHx8IGIgPCAwKSByZXR1cm4gMDsKICAgIGxsIGN1ciA9IGZhY3NbYV07CiAgICBjdXIgPSBtdWwoY3VyLCBmYWNJbnZzW2JdKTsKICAgIGN1ciA9IG11bChjdXIsIGZhY0ludnNbYSAtIGJdKTsKICAgIHJldHVybiBjdXI7Cn0KCnZvaWQgaW5pdEZhY3MoKSB7CiAgICBmYWNzWzBdID0gMTsKICAgIGZhY0ludnNbMF0gPSAxOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBNWDsgaSsrKSB7CiAgICAgICAgZmFjc1tpXSA9IChmYWNzW2kgLSAxXSAqIGkpICUgTU9EOwogICAgICAgIGZhY0ludnNbaV0gPSBpbnYoZmFjc1tpXSk7CiAgICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIE1vJ3MgQWxnb3JpdGhtIHNldHVwCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBBIFF1ZXJ5IHN0b3JlcyBbbCwgcl0gKDAtaW5kZXhlZCkgYW5kIGl0cyBvcmlnaW5hbCBpbmRleApzdHJ1Y3QgUXVlcnkgewogICAgaW50IGwsIHIsIGlkeCwgYmxvY2s7Cn07CgovLyBDb21wYXJhdG9yIGZvciBzb3J0aW5nIHF1ZXJpZXMgaW4gTW8ncyBvcmRlcgpib29sIG1vX2NtcChjb25zdCBRdWVyeSYgQSwgY29uc3QgUXVlcnkmIEIpIHsKICAgIGlmIChBLmJsb2NrICE9IEIuYmxvY2spCiAgICAgICAgcmV0dXJuIEEuYmxvY2sgPCBCLmJsb2NrOwogICAgcmV0dXJuIChBLmJsb2NrICYgMSkgPyAoQS5yID4gQi5yKSA6IChBLnIgPCBCLnIpOwp9CgovLyBHbG9iYWwgLyBzdGF0aWMgdmFyaWFibGVzIGZvciBNbydzCnN0YXRpYyBpbnQgQkxPQ0tfU0laRTsKdmVjdG9yPGludD4gYXJyOwpsbCBjdXJyZW50QW5zd2VyID0gMDsKCi8vIEV4YW1wbGUgZnJlcXVlbmN5IGFycmF5OyBhZGp1c3Qgc2l6ZSBpZiBuZWNlc3NhcnkKLy8gSWYgYXJyW2ldIGNhbiBiZSB1cCB0byAxZTYsIHNpemUgaXQgYWNjb3JkaW5nbHkuCnN0YXRpYyBjb25zdCBpbnQgTUFYViA9IDEwMDAwMDE7CnN0YXRpYyBpbnQgZnJlcVtNQVhWXTsKCgoKdm9pZCBhZGQoaW50IHBvcykgewogICAgaW50IHggPSBhcnJbcG9zXTsKICAgIGludCBwcmV2Y291bnQgPSBmcmVxW3hdOwoKICAgIGN1cnJlbnRBbnN3ZXIgLT0gKHByZXZjb3VudCAqIHByZXZjb3VudCkgKiB4OwoKICAgIGZyZXFbeF0gKys7CiAgICAKICAgIGludCBuZXdjb3VudCA9IGZyZXFbeF07CiAgICBjdXJyZW50QW5zd2VyICs9IChuZXdjb3VudCAqIG5ld2NvdW50KSAqIHg7Cgp9CgovLyBSZW1vdmUgZWxlbWVudCBhdCBwb3NpdGlvbiBwb3MgZnJvbSB0aGUgY3VycmVudCB3aW5kb3cKdm9pZCByZW1vdmVfKGludCBwb3MpIHsKICAgIGludCB4ID0gYXJyW3Bvc107CiAgICBpbnQgcHJldmNvdW50ID0gZnJlcVt4XTsKCiAgICBjdXJyZW50QW5zd2VyIC09IChwcmV2Y291bnQgKiBwcmV2Y291bnQpICogeDsKCiAgICBmcmVxW3hdIC0tOwogICAgCiAgICBpbnQgbmV3Y291bnQgPSBmcmVxW3hdOwogICAgY3VycmVudEFuc3dlciArPSAobmV3Y291bnQgKiBuZXdjb3VudCkgKiB4OwoKCn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGluaXRGYWNzKCk7IC8vIElmIHlvdSBwbGFuIHRvIHVzZSBjaG9vc2UoKSwgZXRjLgoKICAgIGludCBuLCBtLCBrOwogICAgY2luID4+IG4gPj4gbTsKICAgIGFyci5yZXNpemUobik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGNpbiA+PiBhcnJbaV07CiAgICB9CgogICAgLy8gQnVpbGQgcXVlcmllcwogICAgdmVjdG9yPFF1ZXJ5PiBxcyhtKTsKICAgIEJMT0NLX1NJWkUgPSBzdGF0aWNfY2FzdDxpbnQ+KHNxcnQobikpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBpbnQgbCwgcjsKICAgICAgICBjaW4gPj4gbCA+PiByOwogICAgICAgIC0tbDsgLS1yOyAvLyBjb252ZXJ0IHRvIDAtYmFzZWQKICAgICAgICBxc1tpXSA9IHtsLCByLCBpLCBsIC8gQkxPQ0tfU0laRX07CiAgICB9CgogICAgc29ydChxcy5iZWdpbigpLCBxcy5lbmQoKSwgbW9fY21wKTsKCiAgICB2ZWN0b3I8bGw+IGFuc3dlcnMobSk7CiAgICBpbnQgY3VyckwgPSAwLCBjdXJyUiA9IC0xOwogICAgY3VycmVudEFuc3dlciA9IDA7CiAgICBtZW1zZXQoZnJlcSwgMCwgc2l6ZW9mKGZyZXEpKTsKCiAgICBmb3IgKGF1dG8mIHEgOiBxcykgewogICAgICAgIGludCBMID0gcS5sOwogICAgICAgIGludCBSID0gcS5yOwogICAgICAgIHdoaWxlIChjdXJyTCA+IEwpIHsKICAgICAgICAgICAgYWRkKC0tY3VyckwpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoY3VyclIgPCBSKSB7CiAgICAgICAgICAgIGFkZCgrK2N1cnJSKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGN1cnJMIDwgTCkgewogICAgICAgICAgICByZW1vdmVfKGN1cnJMKyspOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoY3VyclIgPiBSKSB7CiAgICAgICAgICAgIHJlbW92ZV8oY3VyclItLSk7CiAgICAgICAgfQogICAgICAgIGFuc3dlcnNbcS5pZHhdID0gY3VycmVudEFuc3dlcjsKICAgIH0KCiAgICAvLyBPdXRwdXQgYW5zd2VycyBpbiBvcmlnaW5hbCBvcmRlcgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBjb3V0IDw8IGFuc3dlcnNbaV0gPDwgIlxuIjsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=