#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 >> k;
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+IG4gPj4gbSA+PiBrOwogICAgYXJyLnJlc2l6ZShuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgY2luID4+IGFycltpXTsKICAgIH0KCiAgICAvLyBCdWlsZCBxdWVyaWVzCiAgICB2ZWN0b3I8UXVlcnk+IHFzKG0pOwogICAgQkxPQ0tfU0laRSA9IHN0YXRpY19jYXN0PGludD4oc3FydChuKSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgIGludCBsLCByOwogICAgICAgIGNpbiA+PiBsID4+IHI7CiAgICAgICAgLS1sOyAtLXI7IC8vIGNvbnZlcnQgdG8gMC1iYXNlZAogICAgICAgIHFzW2ldID0ge2wsIHIsIGksIGwgLyBCTE9DS19TSVpFfTsKICAgIH0KCiAgICBzb3J0KHFzLmJlZ2luKCksIHFzLmVuZCgpLCBtb19jbXApOwoKICAgIHZlY3RvcjxsbD4gYW5zd2VycyhtKTsKICAgIGludCBjdXJyTCA9IDAsIGN1cnJSID0gLTE7CiAgICBjdXJyZW50QW5zd2VyID0gMDsKICAgIG1lbXNldChmcmVxLCAwLCBzaXplb2YoZnJlcSkpOwoKICAgIGZvciAoYXV0byYgcSA6IHFzKSB7CiAgICAgICAgaW50IEwgPSBxLmw7CiAgICAgICAgaW50IFIgPSBxLnI7CiAgICAgICAgd2hpbGUgKGN1cnJMID4gTCkgewogICAgICAgICAgICBhZGQoLS1jdXJyTCk7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChjdXJyUiA8IFIpIHsKICAgICAgICAgICAgYWRkKCsrY3VyclIpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoY3VyckwgPCBMKSB7CiAgICAgICAgICAgIHJlbW92ZV8oY3VyckwrKyk7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChjdXJyUiA+IFIpIHsKICAgICAgICAgICAgcmVtb3ZlXyhjdXJyUi0tKTsKICAgICAgICB9CiAgICAgICAgYW5zd2Vyc1txLmlkeF0gPSBjdXJyZW50QW5zd2VyOwogICAgfQoKICAgIC8vIE91dHB1dCBhbnN3ZXJzIGluIG9yaWdpbmFsIG9yZGVyCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgIGNvdXQgPDwgYW5zd2Vyc1tpXSA8PCAiXG4iOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==