#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL gcd(LL a,LL b){
return b?gcd(b,a%b):a;
}
int n,m;
int c[50005];
int belong[50005];
struct node{
int l,r,id;
}q[50005];
int ans[50005][2];
bool cmp(node a,node b){
return belong[a.l]^belong[b.l]?a.l<b.l:a.r<b.r;
}
LL num;
int cnt[50005];
inline void add(int k){
int x=c[k];
num-=(LL)cnt[x]*(cnt[x]-1)/2;
cnt[x]++;
num+=(LL)cnt[x]*(cnt[x]-1)/2;
}
inline void del(int k){
int x=c[k];
num-=(LL)cnt[x]*(cnt[x]-1)/2;
cnt[x]--;
num+=(LL)cnt[x]*(cnt[x]-1)/2;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
}
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
int size=sqrt(n);
int bnum=ceil((double)n/size);
for(int i=1;i<=bnum;i++){
int l=size*(i-1)+1;
int r=size*i;
for(int j=l;j<=r;j++){
belong[j]=i;
}
}
sort(q+1,q+1+m,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++){
while(l<q[i].l)del(l++);
while(l>q[i].l)add(--l);
while(r<q[i].r)add(++r);
while(r>q[i].r)del(r--);
LL s=num,g=(LL)(r-l+1)*(r-l)/2;
LL k=gcd(s,g);
if(s==0){
ans[q[i].id][0]=0,ans[q[i].id][1]=1;
}
else ans[q[i].id][0]=s/k,ans[q[i].id][1]=g/k;
}
for(int i=1;i<=m;i++){
printf("%d/%d\n",ans[i][0],ans[i][1]);
}
return 0;
}