【模板】莫隊

模板題

#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章