#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+5;
int n,m,num[N];
int read(){
int x=0,f=0;char c=getchar();
while(!isdigit(c)) f|=(c=='-'),c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return f?-x:x;
}
void write(int x){
if(x/10) write(x/10);
putchar(x%10^48);
}
void print(int x){
if(x<0) putchar('-'),x=-x;
write(x),putchar('\n');
}
int gcd(int x,int y){
return y?gcd(y,x%y):x;
}
int pos[N],cnt[N],ans1[N],ans2[N],res1;
struct Q{
int l,r,id;
bool operator <(const Q &b)const{
return pos[l]==pos[b.l]?r<b.r:pos[l]<pos[b.l];
}
}a[N];
int C(int x,int y){
int ans=y*y-y;
return ans/2;
}
void add(int pos){
cnt[num[pos]]++;
res1+=cnt[num[pos]]*(cnt[num[pos]]-1)/2-(cnt[num[pos]]-1)*(cnt[num[pos]]-2)/2;
}
void sub(int pos){
cnt[num[pos]]--;
res1+=cnt[num[pos]]*(cnt[num[pos]]-1)/2-(cnt[num[pos]]+1)*(cnt[num[pos]])/2;
}
signed main(){
n=read(),m=read();
int siz=sqrt(n);
for(int i=1;i<=n;i++) num[i]=read(),pos[i]=(i-1)/siz+1;
for(int i=1;i<=m;i++) a[i].l=read(),a[i].r=read(),a[i].id=i;
sort(a+1,a+1+m);
int l=1,r=0;
for(int i=1;i<=m;i++){
if(a[i].l==a[i].r) continue;
while(a[i].l<l) add(--l);
while(a[i].r>r) add(++r);
while(a[i].l>l) sub(l++);
while(a[i].r<r) sub(r--);
ans1[a[i].id]=res1;
ans2[a[i].id]=(a[i].r-a[i].l+1)*(a[i].r-a[i].l)/2;
}
for(int i=1;i<=m;i++){
if(a[i].l==a[i].r||!ans1[i]) puts("0/1");
else{
int k=gcd(ans1[i],ans2[i]);
write(ans1[i]/k),putchar('/'),print(ans2[i]/k);
}
}
return 0;
}