目前看出来的是输出了太多的0/1
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int ans1[N],ans2[N];
int n,m,c[N],s[N],T,sum;
struct node
{
int l,r,id;
}opr[N];
bool cmp(node a,node b)
{
if(a.l/T==b.l/T)return a.r<b.r;
return a.l<b.l;
}
void Delete(int val)
{
c[s[val]]--;sum-=2*c[s[val]]+1;
}
void Insert(int val)
{
sum+=2*c[s[val]]+1;c[s[val]]++;
}
int gcd(int a,int b)
{
if(b==0)return a;
return gcd(b,a%b);
}
signed main()
{
cin>>n>>m;T=sqrt(n);
for(int i=1;i<=n;i++)cin>>s[i];
for(int i=1;i<=m;i++)
{
cin>>opr[i].l>>opr[i].r;
if(opr[i].l>opr[i].r)
swap(opr[i].l,opr[i].r);
opr[i].id=i;
}
sort(opr+1,opr+m+1,cmp);
int dx=1,dy=0;
for(int i=1;i<=m;i++)
{
int qx=opr[i].l,qy=opr[i].r;
while(dx>qx){dx--;Insert(dx);}
while(dy<qy){dy++;Insert(dy);}
while(dx<qx){Delete(dx);dx++;}
while(dy>qy){Delete(dy);dy--;}
ans1[opr[i].id]=sum-(qy-qx+1);
ans2[opr[i].id]=(qy-qx+1)*(qy-qx);
}
for(int i=1;i<=m;i++)
{
if(ans1[i]==0||opr[i].l==opr[i].r)cout<<"0/1\n";
else
{
int dev=gcd(ans1[i],ans2[i]);
cout<<ans1[i]/dev<<"/"<<ans2[i]/dev<<"\n";
}
}
return 0;
}