自用板子
```
//莫队板子(主要修改add和sub函数)处理静态区间查询问题
LL a[N], ans[N], pos[N], cnt[N];
struct node
{
LL l, r, k;
}q[N];
LL res;
void add(LL n)
{
cnt[a[n]]++;
res += cnt[a[n]] * cnt[a[n]] - (cnt[a[n]] - 1) * (cnt[a[n]] - 1);
}
void sub(LL n)
{
cnt[a[n]]--;
res -= (cnt[a[n]] + 1) * (cnt[a[n]] + 1) - cnt[a[n]] * cnt[a[n]];
}
int main()
{
LL n = read(), m = read(), k = read();
LL siz = sqrt(n);
for (int i = 1; i <= n; i++)
{
a[i] = read();
pos[i] = i / siz;
}
for (int i = 1; i <= m; i++)
{
q[i].l = read(), q[i].r = read();
q[i].k = i;
}
sort(q + 1, q + 1 + m, [](node x, node y)
{
return pos[x.l] == pos[y.l] ? x.r < y.r : pos[x.l] < pos[y.l];
});
LL l = 1, r = 0;
for (int i = 1; i <= m; i++)
{
while (q[i].l < l)add(--l);
while (q[i].r > r)add(++r);
while (q[i].l > l)sub(l++);
while (q[i].r < r)sub(r--);
ans[q[i].k] = res;
}
for (int i = 1; i <= m; i++)
{
printf("%lld\n", ans[i]);
}
return 0;
}
```