把讨论区前几页能找到的坑都查了,但还是调不出来awa
#include<bits/stdc++.h>
#define N 50004
#define int long long
using namespace std;
int n,m,a[N],bl[N]/*block*/,cnt[N];
struct pnt{
int l,r,bh,ans;
}q[N];
bool cmp(pnt a,pnt b){
if(bl[a.l]==bl[b.l])
return a.r<b.r;
return bl[a.l]<=bl[b.l];
}
bool cm(pnt a,pnt b){
return a.bh<b.bh;
}
int gcd(int,int);
void pre();
signed main(){
// cout<<sizeof(int);
freopen("1494_1.in","r",stdin);
freopen("1494_1.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]);
pre();
for(int i=1;i<=m;++i){
scanf("%lld%lld",&q[i].l,&q[i].r);
q[i].bh=i;
}
sort(q+1,q+1+m,cmp);
int l=q[1].l,r=l;
for(;r<=q[1].r;++r){
++cnt[a[r]];
int x=cnt[a[r]];
if(x>1)
q[1].ans+=(x<<1)-2;
else
q[1].ans+=x*x-x;
} --r;
for(int i=2;i<=m;++i){
q[i].ans=q[i-1].ans;
while(l>q[i].l){
++cnt[a[--l]];
int x=cnt[a[l]];
if(x>1)
q[i].ans+=(x<<1)-2;
else
q[i].ans+=x*x-x;
}
while(l<q[i].l){
--cnt[a[l++]];
int x=cnt[a[l-1]];
q[i].ans-=(x<<1);
}
while(r<q[i].r){
++cnt[a[++r]];
int x=cnt[a[r]];
if(x>1)
q[i].ans+=(x<<1)-2;
else
q[i].ans+=x*x-x;
}
while(r>q[i].r){
--cnt[a[r--]];
int x=cnt[a[r+1]];
q[i].ans-=(x<<1);
}
}
sort(q+1,q+1+m,cm);
for(int i=1,k;k=gcd((q[i].r-q[i].l)*(q[i].r-q[i].l+1),q[i].ans),i<=m;++i){
if(q[i].ans&&q[i].r!=q[i].l)
printf("%lld/%lld\n",q[i].ans/k,(q[i].r-q[i].l)*(q[i].r-q[i].l+1)/k);
else
printf("0/1\n");
}
return 0;
}
void pre(){
int B=(int)sqrt(m);
for(int i=1;i<=n;++i){
bl[i]=i/B;
if(i%B)
++bl[i];
}
}
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}