小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。
对于全部的数据,1<=N、M、K<=50000
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define ll long long #define N 50003 using namespace std; int n,m,k; int belong[N],ans[N],num[N],d[N]; struct data { int l,r,num; }; data a[N]; int cmp(data a,data b) { if (belong[a.l]==belong[b.l]) return a.r<b.r; return belong[a.l]<belong[b.l]; } int sqr(int x) { return x*x; } int main() { scanf("%d%d%d",&n,&m,&k); for (int i=1;i<=n;i++) scanf("%d",&d[i]); for (int i=1;i<=m;i++) scanf("%d%d",&a[i].l,&a[i].r),a[i].num=i; int size=ceil(sqrt(n)); for (int i=1;i<=n;i++) belong[i]=(i-1)/size+1; sort(a+1,a+m+1,cmp); int l=1; int r=0; int ans1=0; for (int i=1;i<=m;i++) { while (r<a[i].r) { r++; num[d[r]]++; ans1=ans1-sqr(num[d[r]]-1)+sqr(num[d[r]]); } while (r>a[i].r) { num[d[r]]--; ans1=ans1-sqr(num[d[r]]+1)+sqr(num[d[r]]); r--; } while (l>a[i].l) { l--; num[d[l]]++; ans1=ans1-sqr(num[d[l]]-1)+sqr(num[d[l]]); } while (l<a[i].l) { num[d[l]]--; ans1=ans1-sqr(num[d[l]]+1)+sqr(num[d[l]]); l++; } ans[a[i].num]=ans1; } for (int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0; }