代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 5;
int n, m, sum, size;
int color[N], tong[N];
struct Node{
int l, r, id;
}a[N];
struct Node2{
int _1, _2;
}ans[N];
bool cmp(Node x, Node y){
if(x.l / size == y.l / size){
return (x.l / size) & 1 ? x.r < y.r : x.r > y.r;
}
return x.l < y.l;
}
void add(int x){
sum += tong[x];
tong[x]++;
}
void del(int x){
tong[x]--;
sum -= tong[x];
}
signed main(){
cin >> n >> m;
size = sqrt(n);
for(int i = 1; i <= n; i++){
cin >> color[i];
}
for(int i = 1; i <= m; i++){
cin >> a[i].l >> a[i].r;
a[i].id = i;
}
sort(a + 1, a + 1 + m, cmp);
int l = 1, r = 0;
for(int i = 1; i <= m; i++){
if(a[i].l == a[i].r){
ans[a[i].id]._1 = 0;
ans[a[i].id]._2 = 1;
continue;
}
while(l > a[i].l){
add(color[--l]);
}
while(r < a[i].r){
add(color[++r]);
}
while(l < a[i].l){
del(color[l++]);
}
while(r > a[i].r){
del[color[r--]];
}
ans[a[i].id]._1 = sum;
ans[a[i].id]._2 = (r - l + 1) * (r - l) / 2;
}
for(int i = 1; i <= m; i++){
if(ans[i]._1){
int k = __gcd(ans[i]._1, ans[i]._2);
ans[i]._1 /= k;
ans[i]._2 /= k;
}
else{
ans[i]._2 = 1;
}
cout << ans[i]._1 << "/" << ans[i]._2 << '\n';
}
return 0;
}