#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
struct DATA
{
int l,r,id;
}Q[50005];
int belong[50005],cnt[50005],num1,num2,ans1[50005],ans2[50005],a[50005],n,m;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
bool cmp(DATA a,DATA b)
{
if (belong[a.l]!=belong[b.l]) return belong[a.l]<belong[b.l];
else return a.r<b.r;
}
void update(int l,int r,int al,int ar)
{
while (l<al)
{
if (cnt[a[l]]>=2) num1-=cnt[a[l]]*(cnt[a[l]]-1);
cnt[a[l]]--;
if (cnt[a[l]]>=2) num1+=cnt[a[l]]*(cnt[a[l]]-1);
l++;
}
while (l>al)
{
l--;
if (cnt[a[l]]>=2) num1-=cnt[a[l]]*(cnt[a[l]]-1);
cnt[a[l]]++;
if (cnt[a[l]]>=2) num1+=cnt[a[l]]*(cnt[a[l]]-1);
}
while (r<ar)
{
r++;
if (cnt[a[r]]>=2) num1-=cnt[a[r]]*(cnt[a[r]]-1);
cnt[a[r]]++;
if (cnt[a[r]]>=2) num1+=cnt[a[r]]*(cnt[a[r]]-1);
}
while (r>ar)
{
if (cnt[a[r]]>=2) num1-=cnt[a[r]]*(cnt[a[r]]-1);
cnt[a[r]]--;
if (cnt[a[r]]>=2) num1+=cnt[a[r]]*(cnt[a[r]]-1);
r--;
}
}
signed main()
{
freopen("P1494_1.in","r",stdin);
freopen("myans.out","w",stdout);
scanf("%lld%lld",&n,&m);
int size=0,num=1,lim=sqrt(n) ;
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
belong[i]=num;
size++;
if (size==lim)
{
size=0;
num++;
}
}
for (int i=1;i<=m;i++)
{
scanf("%lld%lld",&Q[i].l,&Q[i].r);
Q[i].id=i;
}
sort(Q+1,Q+1+m,cmp);
int pt=1;
for (int i=1;i<=m;i++)
if (Q[i].l==Q[i].r) ans1[Q[i].id]=0,ans2[Q[i].id]=1,pt++;
for (int i=Q[pt].l;i<=Q[pt].r;i++)
cnt[a[i]]++;
for (int i=1;i<=n;i++)
{
if (cnt[i]>=2)
{
ans1[Q[pt].id]+=cnt[i]*(cnt[i]-1);
num1=ans1[Q[pt].id];
ans2[Q[pt].id]=(Q[pt].r-Q[pt].l+1)*(Q[pt].r-Q[pt].l);
}
}
int last=pt;
for (int i=pt+1;i<=m;i++)
{
if (Q[i].l==Q[i].r)
{
ans1[Q[i].id]=0,ans2[Q[i].id]=1;
continue;
}
update(Q[last].l,Q[last].r,Q[i].l,Q[i].r);
ans1[Q[i].id]=num1;
ans2[Q[i].id]=(Q[i].r-Q[i].l+1)*(Q[i].r-Q[i].l);
if (num1==0 && ans2[Q[i].id]%58311==0) printf("fuckyou\n");
last=i;
}
for (int i=1;i<=m;i++)
{
if (ans1[i]==0)
{
printf("0/1\n");
continue;
}
int GCD=gcd(ans1[i],ans2[i]);
printf("%lld/%lld\n",ans1[i]/GCD,ans2[i]/GCD);
}
return 0;
}
调了老半天了,还是没发现哪里错了