Powerful array CodeForces - 86D

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10; 
int n,m,block;
long long a[maxn],cnt[maxn];
long long ans,s[maxn];
struct node
{
    int l,r,id;
}q[maxn];
bool cmp(node x,node y)
{
    if(x.l/block!=y.l/block)
        return x.l<y.l;
    return x.r<y.r;
}
void add(long long x)
{
    ans-=cnt[x]*cnt[x]*x;
    cnt[x]++;
    ans+=cnt[x]*cnt[x]*x;
}
void del(long long x)
{
    ans-=cnt[x]*cnt[x]*x;
    cnt[x]--;
    ans+=cnt[x]*cnt[x]*x;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        block=sqrt(n);
        memset(cnt,0,sizeof cnt);
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&q[i].l,&q[i].r);
            q[i].id=i;
        }
        sort(q,q+m,cmp);
        int L=1,R=0;
        ans=0;
        for(int i=0;i<m;i++)
        {
            while(L<q[i].l) 
				del(a[L++]);
            while(L>q[i].l) 
				add(a[--L]);
            while(R<q[i].r) 
				add(a[++R]);
            while(R>q[i].r) 
				del(a[R--]);
            s[q[i].id]=ans;
        }
        for(int i=0;i<m;i++)
            printf("%lld\n",s[i]);
    }
    return 0;
}

posted @ 2020-02-28 21:48  晴屿  阅读(96)  评论(0编辑  收藏  举报