·看·看·我·的·
//[L,R]
//(a*(a-1))+(b*(b-1))+(c*(c-1))+.../(r-l+1)*(r-l)
// a^2-a + b^2-b + c^2-c +...
// a^2+b^2+c^2-(r-l+1)
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int f(1),x(0);
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
return f*x;
}
inline void write(int x){
if(x<0) x=-x,putchar('-');
if(x>9) write(x/10);
putchar(x%10+'0');
return ;
}
const int N=51145;
int n,m,a[N],pos[N],cnt[N],ANS(0),ans[N],t;
struct node{
int l,r,k;
} q[N];
//inline bool operator <(const node &a,const node &b){
inline bool cmp(node a,node b){
if(pos[a.l]!=pos[b.l]){
return pos[a.l]<pos[b.l];
}
if(pos[a.l]&1) return pos[a.r]>pos[b.r];
return pos[a.r]<pos[b.r];
}
inline bool USAO(node a,node b){
return a.k<b.k;
}
inline void add(int x){
ANS-=(cnt[x]*cnt[x]);
cnt[x]++;
ANS+=(cnt[x]*cnt[x]);
}
inline void del(int x){
ANS-=(cnt[x]*cnt[x]);
cnt[x]--;
ANS+=(cnt[x]*cnt[x]);
}
signed main(){
n=read(),m=read();
t=sqrt(n);
for(register int i=1;i<=n;i++){
a[i]=read();
pos[i]=(i-1)/t+1;
}
for(register int i=1;i<=m;i++){
q[i].l=read(),q[i].r=read(),q[i].k=i;
}
sort(q+1,q+1+m,cmp);
int L=1,R=0;
for(register int i=1;i<=m;i++){
while(L<q[i].l) del(a[L++]);
while(R>q[i].r) del(a[R--]);
while(L>q[i].l) add(a[--L]);
while(R<q[i].r) add(a[++R]);
ans[q[i].k]=ANS;
}
sort(q+1,q+m+1,USAO);
for(register int i=1;i<=m;i++){
int A=ans[i]-(q[i].r-q[i].l+1),B=(q[i].r-q[i].l+1)*(q[i].r-q[i].l);
int gcd=__gcd(A,B);
A/=gcd,B/=gcd;
write(A),putchar('/'),write(B),puts("");
}
return 0;
}
OJ上能过
但是luogu 10分呜呜呜求条∩


