#include <bits/stdc++.h>
using namespace std;
#define int long long
#define _for(i,l,r) for(int i=(l); i<=(r); i++)
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch<'0' || ch >'9') {if(ch=='-') w = -1, ch = getchar();}
while(ch>='0' && ch<='9') s=s*10 + ch-'0', ch = getchar();
return s*w;
}
const int mmax = 5e4+5;
int N, M, block, ncnt = 0;
int a[mmax], cnt[mmax];
string res;
struct node{
int l,r,id;
int x, y;
}q[mmax];
bool cmp_block(node a, node b){
if(a.l/block == b.l/block) return a.r < b.r;
return a.l/block < b.l/block;
}
bool cmp_id(node a, node b){
return a.id < b.id;
}
inline void add(int x) {ncnt += 1+2*cnt[a[x]], ++cnt[a[x]];}
inline void sub(int x) {ncnt += 1-2*cnt[a[x]], --cnt[a[x]];}
signed main(){
N = read(), M = read();
block = sqrt(N);
_for(i,1,N) scanf("%lld", &a[i]);
_for(i,1,M){
scanf("%lld%lld", &q[i].l, &q[i].r);
q[i].id = i;
}
sort(q+1, q+1+M, cmp_block);
int l = 1, r = 0;
_for(i,1,M){
while(q[i].l < l) add(--l);
while(q[i].r > r) add(++r);
while(q[i].l > l) sub(l++);
while(q[i].r < r) sub(r--);
int a = ncnt-(r-l+1), b = (r-l+1)*(r-l);
int gcd = __gcd(a, b);
q[i].x = a/gcd, q[i].y = b/gcd;
}
sort(q+1, q+1+M, cmp_id);
_for(i, 1, M) printf("%lld/%lld\n", q[i].x, q[i].y);
return 0;
}