#include<bits/stdc++.h>
using namespace std;
int read() {
char c = getchar();
int x = 0, f = 1;
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;
}
const int N = 5e4 + 9,SqrtN = 233;
int n,m;
int c[N],cnt[N];
struct queries{
int l,r;
int id;
} q[N];
int ans1[N],ans2[N];
int GCD(int x,int y){
return y ? GCD(y,x % y) : x;
}
int lres = 1,rres;
struct blocks{
int l,r,size;
} b[SqrtN];
int belong[N];
int block_cnt,block_len;
void build_block(){
block_cnt = block_len = (int)sqrt(n);
for(int i = 1;i <= block_cnt;i++){
b[i].l = b[i - 1].r + 1;
b[i].r = block_len * i;
b[i].size = b[i].r - b[i].l + 1;
}
b[block_cnt].r = n;
b[block_cnt].size = b[block_cnt].r - b[block_cnt].l + 1;
for(int i = 1;i <= block_cnt;i++)
for(int j = b[i].l;j <= b[i].r;j++)
belong[j] = i;
}
bool cmp(queries q1,queries q2){
return belong[q1.l] == belong[q2.l] ? belong[q1.r] < belong[q2.r] : belong[q1.l] < belong[q2.l];
}
int tmp;
int cal(int x){
return (x * (x - 1)) >> 1;
}
void add(int x){
tmp -= cal(cnt[c[x]]);
cnt[c[x]]++;
tmp += cal(cnt[c[x]]);
}
void del(int x){
tmp -= cal(cnt[c[x]]);
cnt[c[x]]--;
tmp += cal(cnt[c[x]]);
}
int main(){
n = read();m = read();
for(int i = 1;i <= n;i++)
c[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++){
int L = q[i].l,R = q[i].r;
while(lres > L)
add(--lres);
while(rres < R)
add(++rres);
while(lres < L)
del(lres++);
while(rres > R)
del(rres--);
ans1[q[i].id] = tmp;
ans2[q[i].id] = cal(q[i].r - q[i].l + 1);
}
for(int i = 1;i <= m;i++){
if(!ans1[i])
printf("0/1\n");
else
printf("%d/%d\n",ans1[i] / GCD(ans1[i],ans2[i]),ans2[i] / GCD(ans1[i],ans2[i]));
}
return 0;
}