#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 10;
int n, m, len;
int a[N], id[N];
int cnt[N];
struct Query
{
int l, r;
int id;
}query[N];
struct answer
{
int l, r;
}ans[N], now;
bool cmp(Query a, Query b)
{
if(id[a.l] != id[b.l]) return id[a.l] < id[b.l];
if(id[a.l] & 1 == 1) return a.r < b.r;
return a.r > b.r;
}
void clac(int id)
{
if(now.l == 0)
{
ans[id] = {0, 1};
return;
}
int d = gcd(now.l, now.r);
ans[id] = {now.l / d, now.r / d};
}
void add(int i)
{
cnt[i] ++ ;
if(cnt[i] > 1) now.l += (cnt[i]) * (cnt[i] - 1) - (cnt[i] - 2) * (cnt[i] - 1);
}
void del(int i)
{
cnt[i] -- ;
if(cnt[i] > 0) now.l -= (cnt[i] + 1) * (cnt[i]) - (cnt[i] - 1) * (cnt[i]);
}
signed main()
{
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++ ) cin >> a[i];
len = sqrt(n);
for(int i = 1 ; i <= n ; i ++ ) id[i] = (i - 1) / len + 1;
for(int i = 1 ; i <= m ; i ++ )
{
int l, r;
cin >> l >> r;
query[i] = {l, r, i};
}
sort(query + 1, query + 1 + m, cmp);
for(int i = query[1].l ; i <= query[1].r ; i ++ ) add(a[i]);
now.r = (query[1].r - query[1].l + 1) * (query[1].r - query[1].l);
clac(query[1].id);
int l = query[1].l;
int r = query[1].r;
for(int i = 2 ; i <= m ; i ++ )
{
while(l < query[i].l) del(a[l ++ ]);
while(l > query[i].l) add(a[ -- l]);
while(r < query[i].r) add(a[ ++ r]);
while(r > query[i].r) del(a[r -- ]);
now.r = (query[i].r - query[i].l + 1) * (query[i].r - query[i].l);
clac(query[i].id);
}
for(int i = 1 ; i <= m ; i ++ ) cout << ans[i].l << "/" << ans[i].r << endl;
return 0;
}