#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+10;
int n,m;
int a[N];
struct q{
int l, r, m;
int all,ans;
}qu[N];
int len,num,be[N],L[N],R[N];
inline int gcd(int x,int y){return !y?x:gcd(y,x%y);}
void init(){
len=sqrt(n);
num=(n+len-1)/len;
for(int i=1;i<=num;i++){
L[i]=R[i-1]+1;
R[i]=i*len;
}
for(int i=1;i<=num;i++){
for(int j=L[i];j<=R[i];j++){
be[j]=i;
}
}
}
bool cmp(q a,q b){
return be[a.l]==be[b.l] ? a.r<b.r : be[a.l]<be[b.l];
}
bool cmp1(q a,q b){
return a.m<b.m;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>qu[i].l>>qu[i].r;
qu[i].m=i;
}
init();
sort(qu+1,qu+m+1,cmp);
int l=1,r=1;
int t[N];
memset(t,0,sizeof(t));
int nowans=0;
for(int i=1;i<=m;i++){
qu[i].all=(qu[i].r-qu[i].l)*(qu[i].r-qu[i].l+1)/2;
while(l<qu[i].l){
if(t[a[l]]>=2)
nowans-=t[a[l]]*(t[a[l]]-1)/2-(t[a[l]]-1)*(t[a[l]]-2)/2;
t[a[l]]--;
l++;
}
while(l>qu[i].l){
if(t[a[l-1]]>=1)
nowans+=t[a[l-1]]*(t[a[l-1]]+1)/2-(t[a[l-1]]-1)*(t[a[l-1]])/2;
l--;
t[a[l]]++;
}
while(r<qu[i].r){
if(t[a[r+1]]>=1)
nowans+=t[a[r+1]]*(t[a[r+1]]+1)/2-(t[a[r+1]]-1)*(t[a[r+1]])/2;
r++;
t[a[r]]++;
}
while(r>qu[i].r){
if(t[a[r]]>=2)
nowans-=t[a[r]]*(t[a[r]]-1)/2-(t[a[r]]-1)*(t[a[r]]-2)/2;
t[a[r]]--;
r--;
}
qu[i].ans=nowans;
}
sort(qu+1,qu+m+1,cmp1);
for(int i=1;i<=m;i++){
if(qu[i].l==qu[i].r or qu[i].ans==0 or qu[i].all==0) cout<<0<<"/"<<1<<endl;
else{
cout<<qu[i].ans/gcd(qu[i].ans,qu[i].all)<<"/"<<qu[i].all/gcd(qu[i].ans,qu[i].all)<<endl;
}
}
return 0;
}