#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Node{
int l,r,bh;
}arr[50005];
int n,m,temp;
int vis[50005],colour[50005],ans[2][50005];
inline int read(){//此快读在网上盗取
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
bool cmp(Node x,Node y){
if(x.l/temp!=y.l/temp){
return x.l<y.l;
}
return ((int)(x.l/temp)&1?x.r<y.r:x.r>y.r);
}
signed main(){
n=read();
m=read();
temp=sqrt(n);
for(int i=1;i<=n;i++){
colour[i]=read();
}
for(int i=1;i<=m;i++){
arr[i].l=read();
arr[i].r=read();
arr[i].bh=i;
}
sort(arr+1,arr+m+1,cmp);
int left=1,right=0;
int sum=0;
for(int i=1;i<=m;i++){
while(left>arr[i].l){
left--;
sum-=vis[colour[left]]*vis[colour[left]];
vis[colour[left]]++;
sum+=vis[colour[left]]*vis[colour[left]];
}
while(right<arr[i].r){
right++;
sum-=vis[colour[right]]*vis[colour[right]];
vis[colour[right]]++;
sum+=vis[colour[right]]*vis[colour[right]];
}
while(left<arr[i].l){
sum-=vis[colour[left]]*vis[colour[left]];
vis[colour[left]]--;
sum+=vis[colour[left]]*vis[colour[left]];
left++;
}
while(right>arr[i].r){
sum-=vis[colour[right]]*vis[colour[right]];
vis[colour[right]]--;
sum+=vis[colour[right]]*vis[colour[right]];
right--;
}
if(arr[i].l==arr[i].r){
ans[0][i]=0;
ans[1][i]=1;
continue;
}
ans[0][arr[i].bh]=sum-(arr[i].r-arr[i].l+1);
ans[1][arr[i].bh]=1ll*(right-left+1)*(right-left);
int g=__gcd(ans[0][arr[i].bh],ans[1][arr[i].bh]);
ans[0][arr[i].bh]/=g;
ans[1][arr[i].bh]/=g;
}
for(int i=1;i<=m;i++){
printf("%lld/%lld\n",ans[0][i],ans[1][i]);
}
return 0;
}
~《此快读从网上盗取》~