#include<bits/stdc++.h>
#define MAXN 500005
#define int long long
using namespace std;
int n,m;
int num[MAXN];
int tot[MAXN];
struct node{
int l,r;
int id;
}que[MAXN];
int colo[MAXN];
int ansup[MAXN];
int ansdown[MAXN];
bool cmp(node a,node b)
{
if(colo[a.r]==colo[b.r])
return a.r<b.r;
return a.l<b.l;
}
int l,r;
int sum;
void add(int col)
{
sum+=tot[col];
tot[col]++;
}
void del(int col)
{
tot[col]--;
sum-=tot[col];
}
signed main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&num[i]);
for(int i=1;i<=m;++i)
scanf("%d%d",&que[i].l,&que[i].r),que[i].id=i;
int block=500;
for(int i=1;i<=n;++i)
colo[i]=(i-1)/block+1;
sort(que+1,que+1+m,cmp);
for(int i=1,l=1,r=0;i<=m;++i)
{
if(que[i].l==que[i].r)
{
ansup[que[i].id]=0,ansdown[que[i].id]=1;
continue;
}
while(l>que[i].l)add(num[--l]);
while(r<que[i].r)add(num[++r]);
while(l<que[i].l)del(num[l++]);
while(r>que[i].r)del(num[r--]);
ansup[que[i].id]=sum;
ansdown[que[i].id]=(r-l+1)*(r-l)/2;
}
for(int i=1;i<=m;++i)
{
if(ansup[i]==0)
{
printf("0/1\n");
continue;
}
int g=__gcd(ansup[i],ansdown[i]);
printf("%d/%d\n",ansup[i]/g,ansdown[i]/g);
}
return 0;
}