莫队

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn = 5e5+100;
  5. const int maxm =1e6+100;
  6. ll re[maxm];
  7. ll a[maxn],anss[maxn];
  8. struct query{
  9. ll l,r,id;
  10. ll ans;
  11. }e[maxn];
  12. ll ans,bl;
  13. inline int read()
  14. {
  15. int k=0;
  16. char c;
  17. c=getchar();
  18. while(!isdigit(c))c=getchar();
  19. while(isdigit(c)){k=(k<<3)+(k<<1)+c-'0';c=getchar();}
  20. return k;
  21. }
  22. void remove(int pos){
  23. ans-=a[pos]*((re[a[pos]]*re[a[pos]])-(re[a[pos]]-1)*(re[a[pos]]-1));
  24. re[a[pos]]--;
  25. }
  26. void add(int pos){
  27. ans+=a[pos]*(-(re[a[pos]]*re[a[pos]])+(re[a[pos]]+1)*(re[a[pos]]+1));
  28. ++re[a[pos]];
  29. }
  30. bool cmp1(query a,query b){
  31. return (a.l/bl==b.l/bl)?a.r<b.r:a.l<b.l;
  32. }
  33. bool cmp2(query a,query b){
  34. return a.id<=b.id;
  35. }
  36. int n,m,i;
  37. int main(){
  38. //freopen("1.in","r",stdin);
  39. scanf("%d %d",&n,&m);
  40. for(i=1;i<=n;i++) scanf("%lld",&a[i]);
  41. for(i=1;i<=m;i++){
  42. scanf("%lld %lld",&e[i].l,&e[i].r);
  43. e[i].id=i;
  44. }
  45. bl=sqrt(n);
  46. sort(e+1,e+m+1,cmp1);
  47. ans=0;
  48. int L,R;
  49. int curl=1;int curr=0;
  50. for(i=1;i<=m;i++){
  51. L=e[i].l;R=e[i].r;
  52. while(curl<L) remove(curl++);
  53. while(curl>L) add(--curl);
  54. while(curr>R) remove(curr--);
  55. while(curr<R) add(++curr);
  56. anss[e[i].id]=ans;
  57. }
  58. for(i=1;i<=m;i++){
  59. printf("%lld\n",anss[i]);
  60. }
  61. return 0;
  62. }
  63. //O(nlog(n))