模闆題
#include<bits/stdc++.h>
using namespace std;
int n,a[300005],pos[300005],m,sum[1000005];
long long ans[2000005],x;
struct mzls
{
int l,r,id;
bool operator<(const mzls &x)const
{
if(pos[l]==pos[x.l])
return r<x.r;
return pos[l]<pos[x.l];
}
}a1[2000005];
inline void X(int i,int ml)
{
x-=1ll*sum[a[i]]*sum[a[i]]*a[i];
sum[a[i]]+=ml;
x+=1ll*sum[a[i]]*sum[a[i]]*a[i];
}
int main()
{
scanf("%d%d",&n,&m);
int d=sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
pos[i]=i/d;
}
for(int i=1;i<=m;i++)
scanf("%d%d",&a1[i].l,&a1[i].r),a1[i].id=i;
sort(a1+1,a1+m+1);
int l1=1,r1=0;
for(int i=1;i<=m;i++)
{
while(r1>a1[i].r)
X(r1--,-1);
while(r1<a1[i].r)
X(++r1,1);
while(l1>a1[i].l)
X(--l1,1);
while(l1<a1[i].l)
X(l1++,-1);
ans[a1[i].id]=x;
}
for(int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}