#include<bits/stdc++.h>
#define ll long long
#define F(i,a,b) for(ll i=a;i<=b;i++)
#define R(i,a,b) for(ll i=a;i>=b;i--)
#define sc(a) scanf("%lld",&a)
#define ps(a) printf("%lld ",a)
#define pn(a) printf("%lld\n",a)
using namespace std;
const ll N=5e4+7;
ll n,m,sz,a[N],vis[N],sum=0,sump=0;
struct Ans{
ll fz,fm;
}ans[N];
struct Moque{
ll l,r,id;
}moq[N];
inline bool cmp(const Moque& a,const Moque& b){
return (a.l-1)/sz==(b.l-1)/sz?a.r<b.r:a.l<b.l;
}
inline ll ins(ll x){
sum-=vis[x]*vis[x],sump-=vis[x];
vis[x]++;
sum+=vis[x]*vis[x],sump+=vis[x];
}
inline ll del(ll x){
sum-=vis[x]*vis[x],sump-=vis[x];
vis[x]--;
sum+=vis[x]*vis[x],sump+=vis[x];
}
inline ll gcd(ll a,ll b){
if(!b) return a;
return gcd(b,a%b);
}
int main(){
sc(n),sc(m);
sz=sqrt(n);
F(i,1,n) sc(a[i]);
F(i,1,m){
sc(moq[i].l),sc(moq[i].r);
moq[i].id=i;
}
sort(moq+1,moq+m+1,cmp);
ll l=1,r=0;
F(i,1,m){
if(moq[i].l==moq[i].r){
ans[moq[i].id].fz=0;
ans[moq[i].id].fm=1;
continue;
}
while(l<moq[i].l) del(a[l++]);
while(l>moq[i].l) ins(a[--l]);
while(r<moq[i].r) ins(a[++r]);
while(r>moq[i].r) del(a[r--]);
ans[moq[i].id].fz=sum-sump;
ans[moq[i].id].fm=(moq[i].r-moq[i].l+1)*(moq[i].r-moq[i].l);
}
F(i,1,m){
if(ans[i].fz==0){
printf("0/1\n");
continue;
}
ll d=gcd(ans[i].fz,ans[i].fm);
ans[i].fz/=d,ans[i].fm/=d;
printf("%lld/%lld\n",ans[i].fz,ans[i].fm);
}
return 0;
}