题意:见题面
题解:莫队模板
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 5e4 + 10;
int c[maxn], a[maxn], n, m, k, block;
ll ans[maxn], sum;
struct node {
int l, r, id;
bool operator<(const node& t) const {
if (l / block == t.l / block)
return r < t.r;
return l / block < t.l / block;
}
} q[maxn];
ll jie(int x) {
return 1ll * x * x;
}
void sub(int p) {
sum = sum - jie(c[a[p]]) + jie(c[a[p]] - 1);
c[a[p]]--;
}
void add(int p) {
sum = sum - jie(c[a[p]]) + jie(c[a[p]] + 1);
c[a[p]]++;
}
int main() {
cin >> n >> m >> k;
block = sqrt(n);
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= m; i++)
cin >> q[i].l >> q[i].r, q[i].id = i;
sort(q + 1, q + 1 + m);
int l = q[1].l;
int r = q[1].l - 1;
for (int i = 1; i <= m; i++) {
while (l < q[i].l)
sub(l++);
while (l > q[i].l)
add(--l);
while (r < q[i].r)
add(++r);
while (r > q[i].r)
sub(r--);
ans[q[i].id] = sum;
}
for (int i = 1; i <= m; i++)
cout << ans[i] << "\n";
}