#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=5e4+5;
struct peo {
int l,r,id,le;
} qq[N],ans[N];
int sz,a[N],n,m,sum,alsum,le;
int cnt[N],jie[N];
int lcur=1,rcur=0;
inline void add(int x) {
sum+=cnt[x];
cnt[x]++;
}
inline void del(int x) {
cnt[x]--;
sum-=cnt[x];
}
bool cmp(peo ax,peo bx) {
return ax.r/sz==bx.r/sz?ax.r/sz<bx.r/sz:ax.l/sz<bx.l/sz;
}
template <typename Tp>
Tp gcd(Tp a, Tp b) {
return b == 0 ? a : gcd(b, a % b);
}
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-48;
ch=getchar();
}
return x*f;
}
//int gcd(int x,int y){
// if(y==0) return x;
// else return gcd(y,x%y);
//}
int main() {
// freopen("P1494_1.in","r",stdin);
// freopen("P1494_1.out","w",stdout);
// scanf("%d%d",&n,&m);
n=read(),m=read();
for(int i=1; i<=n; i++)
{
a[i]=read();
}
sz=(int)n/sqrt(n*2/3);
for(int i=1; i<=m; i++) {
// scanf("%d%d",&qq[i].l,&qq[i].r);
qq[i].l=read(),qq[i].r=read();
qq[i].id=i;
}
sort(qq+1,qq+1+m,cmp);
for(int i=1; i<=m; i++) {
if(qq[i].l==qq[i].r){
ans[qq[i].id].id=0;
ans[qq[i].id].le=1;
continue;
}
while(lcur>qq[i].l) add(a[--lcur]);
while(lcur<qq[i].l) del(a[lcur++]);
while(rcur>qq[i].r) del(a[rcur--]);
while(rcur<qq[i].r) add(a[++rcur]);
ans[qq[i].id].id=sum;
ans[qq[i].id].l=qq[i].l;
ans[qq[i].id].r=qq[i].r;
}
for(int i=1; i<=m; i++) {
if(ans[i].id==0) {
printf("0/1\n");
continue;
}
ans[i].le=ans[i].r-ans[i].l;
if(ans[i].le&1) ans[i].le=ans[i].le/2*(ans[i].le+1)+(ans[i].le+1)/2;
else ans[i].le=ans[i].le/2*(ans[i].le+1);
int g=gcd(ans[i].le,ans[i].id);
printf("%d/%d\n",ans[i].id/g,ans[i].le/g);
}
return 0;
}
求助求助,奉上我的关注