rt。。。
当 mn=0 的时候会 RE,但是先不要管。(
# include <bits/stdc++.h>
#define int long long
#define rint register int
#define YOU_AK_IOI exit(0);
using namespace std;
const int N = 5e4 + 10;
int n ,Q ,res ,a[N] ,block[N] ,cnt[N];
int ans[N];
struct queries{
int l ,r ,id;
queries() {}
inline bool operator <(const queries &x) const {
if(block[l] ^ block[x.l]) return block[l] < block[x.l];
else if(block[l] & 1) return r < x.r;
else return r > x.r;
}
}q[N];
inline void add(int x){
res -= cnt[a[x]] * cnt[a[x]];
++ cnt[a[x]];
res += cnt[a[x]] * cnt[a[x]];
} inline void del(int x){
res -= cnt[a[x]] * cnt[a[x]];
-- cnt[a[x]];
res += cnt[a[x]] * cnt[a[x]];
} signed main(){
scanf("%lld %lld" ,&n ,&Q);
int len = n / sqrt(Q);
for(rint i = 1 ;i <= n;i ++)
scanf("%lld", a + i) ,block[i] = (i - 1) / len + 1;
for(rint i = 1; i <= Q;i ++){
scanf("%lld %lld" ,&q[i].l ,&q[i].r);
q[i].id = i;
} sort(q + 1 ,q + 1 + Q);
int l = 1 ,r = 0;
for(rint i = 1 ;i <= Q ;i ++){
while(l > q[i].l) add(-- l);
while(r < q[i].r) add(++ r);
while(l < q[i].l) del(l ++);
while(r > q[i].r) del(r --);
ans[q[i].id] = res;
} for(rint i = 1 ;i <= Q ;i ++) printf("%lld\n", ans[i]);
YOU_AK_IOI
}