#include<bits/stdc++.h>
#define N 50010
using namespace std;
int read()
{
int x = 0,f = 1;
char c = getchar();
while(c<'0' || c>'9')
{
if(c=='-') f = -1;
c = getchar();
}
while(c>='0' && c<='9')
{
x = (x<<3)+(x<<1)+(c^48);
c = getchar();
}
return x*f;
}
struct rec
{
int l,r,id;
};
struct node
{
int x,y;
void solve()
{
if (x==0) y=1;
else
{
int k = __gcd(x,y);
x /= k;
y /= k;
}
}
};
rec q[N];
node ans[N];
int a[N],b[N],curL=1,curR,ans_now,cnt;
bool cmp(rec a,rec b)
{
return a.l/cnt==b.l/cnt ? a.r<b.r : a.l<b.l;
}
void dele(int x)
{
ans_now -= (b[a[x]]-1);
b[a[x]]--;
if (b[a[x]]>0) ans_now += b[a[x]]*(b[a[x]]-1)/2;
}
void add(int x)
{
b[a[x]]++;
if (b[a[x]]>0) ans_now += b[a[x]]-1;
}
int main()
{
int n=read(),m=read();
cnt = sqrt(n);
for (int i=1;i<=n;i++)
a[i] = read();
for (int i=1;i<=m;i++)
{
q[i].l=read(),q[i].r=read();
q[i].id = i;
}
sort(q+1,q+m+1,cmp);
for (int i=1;i<=m;i++)
{
while (curL<q[i].l) dele(curL++);
while (curR<q[i].r) add(++curR);
while (curL>q[i].l) add(--curL);
while (curR>q[i].r) dele(curR--);
ans[q[i].id].x = ans_now;
ans[q[i].id].y = (q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2;
ans[q[i].id].solve();
}
for (int i=1;i<=m;i++)
cout << ans[i].x << "/" << ans[i].y << endl;
return 0;
}
记录