#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
#include<cmath>
using namespace std;
const int N = 50000+5;
typedef long long LL;
int PreSum[N], ans, belong[N], a[N];
struct Node{
LL l, r, id;
LL ans, all;
}q[N];
int cmp(Node a, Node b)
{
return belong[a.l] != belong[b.l] ? a.l<b.l : a.r<b.r;
}
int CMP(Node a, Node b)
{
return a.id < b.id;
}
LL gcd(LL a,LL b){ //求最大公约数一般有三种方法,这里用到的是辗转相除法
LL c=1;
while(c!=0) {
c=b%a;
if(c){
b=a;
a=c;
}
}
return a;
}
void add(LL i)
{
ans += PreSum[a[i]];//比如在此操作之前a[i]有四个,则此时,ans个数会加四
PreSum[a[i]]++;
}
void del(LL i)
{
PreSum[a[i]]--;
ans -= PreSum[a[i]];//相当于恢复相加之前的状态
}
int main()
{
LL n, m;
while(cin >> n >> m){
memset(PreSum, 0, sizeof(PreSum));
ans = 0;
LL Numb = sqrt(n);
if(n%Numb){
Numb ++ ;
}
for(LL i=1; i<=n; i++){
cin >> a[i];
belong[i] = (i/Numb)+1;
}
for(LL i=1; i<=m; i++){
cin >> q[i].l >> q[i].r;
q[i].id = i;//保留原位置,因为后面排序可能会将次序打乱,记录下来可在最后输出时排序恢复原来的次序
}
sort(q+1, q+1+m, cmp);
LL l = 1, r = 0;
for(int i=1; i<=m; i++){
while(l < q[i].l){
del(l);
l++;
}
while(l > q[i].l){
l--;
add(l);
}
while(r < q[i].r){
r++;
add(r);
}
while(r > q[i].r){
del(r);
r--;
}
q[i].ans = ans;
if(ans==0){ //根据题目要求如果分子等于零,分母直接为1
q[i].all=1;
continue;
}
q[i].all = (q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2;
LL gcd1=gcd(q[i].ans, q[i].all);
q[i].ans /= gcd1;
q[i].all /= gcd1;
}
for(int i=1; i<=m; i++){
printf("%lld/%lld\n", q[i].ans, q[i].all);
}
}
return 0;
}