求助莫队
查看原帖
求助莫队
324666
diqiuyi奶龙楼主2022/2/2 22:33
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
struct q{
	int l,r,id;
	ull Ans;
}qu[200010];
ull quei[200010],sum[200010],a[200010],ans,n,m;
void md(int x,int add){
	ans-=sum[a[x]]*sum[a[x]]*a[x];
	sum[a[x]]+=add;
	ans+=sum[a[x]]*sum[a[x]]*a[x];
}
void Mo(){
	for(int i=1,lct=1,rct=0;i<=m;i++){
		for(;rct<qu[i].r;rct++)
			md(rct+1,1);
		for(;rct>qu[i].r;rct--)
			md(rct,-1);
		for(;lct<qu[i].l;lct++)
			md(lct,-1);
		for(;lct>qu[i].l;lct--)
			md(lct-1,1);
		qu[i].Ans=ans;
	}
}
bool cmp(const q &A,const q &B){
	return quei[A.l]==quei[B.l]?A.r<B.r:A.l<B.l;
}
bool ids(const q &x,const q &y){
	return x.id<y.id;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=m;i++){
		cin>>qu[i].l>>qu[i].r;
		qu[i].id=i;
	}
	int qrn=sqrt(n);
	for(int i=1;i<=n;i++)
		quei[i]=(i-1)/qrn+1;
	sort(qu+1,qu+m+1,cmp);
	Mo();
	sort(qu+1,qu+m+1,ids);
	for(int i=1;i<=m;i++)
		cout<<qu[i].Ans<<endl;
	return 0;
}
2022/2/2 22:33
加载中...