写法可能有点不同于题解(
感觉cnt写挂了,但是我没有证据
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
typedef long long ll;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=((x<<3)+(x<<1))+(c-'0');
c=getchar();
}
return x*f;
}
int len;
int a[maxn],ans[maxn],all[maxn];
int num[maxn];
struct ask
{
int l,r,k;
bool operator<(const ask &x)const
{
if(l/len!=x.l/len)
return l<x.l;
if((l/len)%2==0)
return r<x.r;
return r>x.r;
}
};
ask q[maxn];
int ql=q[1].l,qr=q[1].l,cnt=0;
inline void add(int x)
{
num[a[x]]++;
if(num[a[x]]>=2)
cnt+=num[a[x]]-1;
return;
}
inline void del(int x)
{
num[a[x]]--;
if(num[a[x]]>=1)
cnt-=num[a[x]];
return;
}
int main()
{
int n=read(),m=read();
len=sqrt(n);
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=m;i++)
q[i].l=read(),q[i].r=read(),q[i].k=i;
sort(q+1,q+m+1);
num[a[q[1].l]]++;
for(int i=1;i<=m;i++)
{
while(ql<q[i].l)
del(ql++);
while(qr<q[i].r)
add(++qr);
while(q[i].l<ql)
add(--ql);
while(q[i].r<qr)
del(qr--);
if(cnt==0)
ans[q[i].k]=0,all[q[i].k]=1;
else
{
int g=__gcd(cnt,(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2);
ans[q[i].k]=cnt/g,all[q[i].k]=(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2/g;
}
}
for(int i=1;i<=m;i++)
printf("%d/%d\n",ans[i],all[i]);
return 0;
}