rt,萌新求条
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,k;
int a[N],cnt[N];
int tmp[N],blong[N],B;
int L=1,R;
struct Kano{
int l,r;
int id;
}q[N];
struct Kano1{
int fz,fm;
int id;
}ans[N];
bool cmp(Kano a, Kano b)
{
if(blong[a.l]!=blong[b.l]) return blong[a.l]<blong[b.l];
return a.r<b.r;
}
int main()
{
scanf("%d %d",&n,&m);
B = pow(n,0.5);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
for(int i=1; i<=n; i++)
blong[i] = ceil(i*1.0/B);
for(int i=1; i<=m; i++)
{
scanf("%d %d",&q[i].l,&q[i].r);
q[i].id = i;
}
sort(q+1, q+m+1, cmp);
int fz1 = 0, fm1 = 0;
for(int i=1; i<=m; i++)
{
int len = R - L + 1;
while(q[i].l > L)
{
fm1 -= len * (len - 1) / 2;
len--;
fm1 += len * (len - 1) / 2;
fz1 -= tmp[a[L]] * (tmp[a[L]] - 1) / 2;
tmp[a[L]]--;
fz1 += tmp[a[L]] * (tmp[a[L]] - 1) / 2;
L++;
}
while(q[i].l < L)
{
L--;
fm1 -= len * (len - 1) / 2;
len++;
fm1 += len * (len - 1) / 2;
fz1 -= tmp[a[L]] * (tmp[a[L]] - 1) / 2;
tmp[a[L]]++;
fz1 += tmp[a[L]] * (tmp[a[L]] - 1) / 2;
}
while(q[i].r > R)
{
fm1 -= len * (len - 1) / 2;
len++;
fm1 += len * (len - 1) / 2;
R++;
fz1 -= tmp[a[R]] * (tmp[a[R]] - 1) / 2;
tmp[a[R]]++;
fz1 += tmp[a[R]] * (tmp[a[R]] - 1) / 2;
}
while(q[i].r < R)
{
fm1 -= len * (len - 1) / 2;
len--;
fm1 += len * (len - 1) / 2;
fz1 -= tmp[a[R]] * (tmp[a[R]] - 1) / 2;
tmp[a[R]]--;
fz1 += tmp[a[R]] * (tmp[a[R]] - 1) / 2;
R--;
}
ans[q[i].id].fz = fz1;
ans[q[i].id].fm = fm1;
}
for(int i=1; i<=m; i++)
{
int gcd = __gcd(ans[i].fz, ans[i].fm);
printf("%d/%d\n", ans[i].fz / gcd, ans[i].fm / gcd);
}
return 0;
}