using namespace std;
struct que
{
int l,r,num;
}q[500005];
bool cmp1(que x,que y)
{
return x.l<y.l;
}
bool cmp2(que x,que y)
{
return x.l<y.r;
}
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int n,m,i,j,k,c[500005 ],t,l[500005 ],r[500005 ]
,sum[500005],front[500005],second[500005 ],ans;
bool v[500005];
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>c[i];
for(i=1;i<=m;i++)
{
cin>>q[i].l>>q[i].r,q[i].num=i;
}
sort(q+1,q+m+1,cmp1);
t=sqrt(m);
for(i=1;i<=t;i++)
{
l[i]=(i-1)*sqrt(m)+1;
r[i]=i*sqrt(m);
}
if(r[t]<m)
{
t++;l[t]=r[t-1]+1;r[t]=m;
}
for(i=1;i<=t;i++)
sort(q+l[i],q+r[i]+1,cmp2);
for(i=1;i<=t;i++)
{
memset(sum,0,sizeof(sum));
memset(v,0,sizeof(v));ans=0;
int l0=q[l[i]].l,r0=q[l[i]].r;
for(j=l0;j<=r0;j++)
sum[c[j]]++;
for(j=l0;j<=r0;j++)
{
if(v[c[j]]) continue;
v[c[j]]=1;
ans+=sum[c[j]]*(sum[c[j]]-1)/2;
}
int mol=(r0-l0+1)*(r0-l0)/2,g=gcd(mol,ans);
if(l0==r0||g==0)
front[q[l[i]].num]=0,second[q[l[i]].num]=1;
else
front[q[l[i]].num]=ans/g,second[q[l[i]].num]=mol/g;
//cout<<l0<<' '<<r0<<" "<<ans/g<<" "<<mol/g<<endl;
for(j=l[i]+1;j<=r[i];j++)
{
memset(v,0,sizeof(v));ans=0;
l0=q[j].l,r0=q[j].r;
for(k=q[j-1].l;k<l0;k++)
sum[c[k]]--;
for(k=l0;k<q[j-1].l;k++)
sum[c[k]]++;
for(k=q[j-1].r+1;k<=r0;k++)
sum[c[k]]++;
for(k=r0+1;k<=q[j-1].r;k++)
sum[c[k]]--;
for(k=l0;k<=r0;k++)
{
if(v[c[k]]) continue;
v[c[k]]=1;
ans+=sum[c[k]]*(sum[c[k]]-1)/2;
}
mol=(r0-l0+1)*(r0-l0)/2;g=gcd(mol,ans);
if(l0==r0||g==0)
front[q[j].num]=0,second[q[j].num]=1;
else
front[q[j].num]=ans/g,second[q[j].num]=mol/g;
//cout<<l0<<' '<<r0<<" "<<ans/g<<" "<<mol/g<<endl;
}
}
for(i=1;i<=m;i++)
cout<<front[i]<<"/"<<second[i]<<endl;
return 0;
}