求助,还有什么地方可以优化
#include <bits/stdc++.h>
#define int long long
#define N 50001
using namespace std;
inline void read(int& x)
{
x = 0;
int f = 1;
char ch = getchar();
while (ch < 48 || ch > 57)
{
if (ch == 45) f = -1;
ch = getchar();
}
while (ch >= 48 && ch <= 57)
{
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
x = x * f;
}
inline void write(int x)
{
if (x < 0)
{
putchar(45);
x = -x;
}
if (x > 9) write(x / 10);
putchar(x % 10 + 48);
}
//////////////////////////////////////////////////
int n, m, kkk;
int L, R;
int a[N], block[N];
int cnt[N];
int sum;
inline int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a % b);
}
inline void add(int k)
{
sum += (cnt[k]++ << 1);
}
inline void del(int k)
{
sum -= (--cnt[k] << 1);
}
struct node
{
int l;
int r;
int block;
int id;
}q[N];
bool cmp(node a, node b)
{
return (a.block == b.block) ? (a.block & 1) ? a.r > b.r : a.r < b.r : a.l < b.l;
}
int fz[N];
int fm[N];
signed main(void)
{
read(n); read(m); kkk = n / sqrt(m * 2 / 3);
for (register int i = 1; i <= n; ++i) read(a[i]);
for (register int i = 1; i <= m; ++i)
{
read(q[i].l);
read(q[i].r);
q[i].block = i / kkk;
q[i].id = i;
}
L = q[1].l; R = L - 1;
for (register int i = 1; i <= m; ++i)
{
int x = q[i].l;
int y = q[i].r;
if (x == y) continue;
while (L < x) del(a[L++]);
while (L > x) add(a[--L]);
while (R > y) del(a[R--]);
while (R < y) add(a[++R]);
fz[q[i].id] = sum;
fm[q[i].id] = (R - L + 1) * (R - L);
}
for (register int i = 1; i <= m; ++i)
{
if (fz[i] == 0)
{
puts("0/1");
continue;
}
int g = gcd(fm[i], fz[i]);
printf("%lld / %lld\n", fz[i] / g, fm[i] / g);
}
return 0;
}