我也不知道怎么优化了捏 求大佬帮帮捏
#include<bits/stdc++.h>
#define int long long
using namespace std;
int num[100005];
struct node{
int le;
int ri;
int id;
}line[100005];
int ans1[100005];
int ans2[100005];
int buc[100005];
int n;
int fk(int N,int pos){
int sq=floor(1.0*sqrt(N));
return floor(1.0*pos/sq)+1;
}
bool cmp(node x,node y){
int fk1=fk(n,x.ri);
int fk2=fk(n,y.ri);
if(fk1!=fk2)return fk1<fk2;
else return x.le<y.le;
}
int l,r;
long long present=0;
void movenxtr(int now,int to){
while(r+1<=to){
r++;
present-=buc[num[r]]*buc[num[r]]-buc[num[r]];
buc[num[r]]++;
present+=buc[num[r]]*buc[num[r]]-buc[num[r]];
}
}
void movefrontr(int now,int to){
while(r-1>=to){
present-=buc[num[r]]*buc[num[r]]-buc[num[r]];
buc[num[r]]--;
present+=buc[num[r]]*buc[num[r]]-buc[num[r]];
r--;
}
}
void movenxtl(int now,int to){
while(l+1<=to){
present-=buc[num[l]]*buc[num[l]]-buc[num[l]];
buc[num[l]]--;
present+=buc[num[l]]*buc[num[l]]-buc[num[l]];
l++;
}
}
void movefrontl(int now,int to){
while(l-1>=to){
l--;
present-=buc[num[l]]*buc[num[l]]-buc[num[l]];
buc[num[l]]++;
present+=buc[num[l]]*buc[num[l]]-buc[num[l]];
}
}
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-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
int gcd(int a,int b){
if(b==0){
return a;
}
else return gcd(b,a%b);
}
signed main(){
int n,m;
n=read();
m=read();
for(int i=1;i<=n;i++){
num[i]=read();
}
for(int i=1;i<=m;i++){
line[i].le=read();
line[i].ri=read();
line[i].id=i;
}
sort(line+1,line+1+m,cmp);
l=line[1].ri;
r=line[1].ri;
buc[num[line[1].ri]]++;
for(int i=1;i<=m;i++){
int left=line[i].le;
int right=line[i].ri;
int id=line[i].id;
movenxtl(l,left);
movenxtr(r,right);
movefrontl(l,left);
movefrontr(r,right);
int fm=(right-left+1)*(right-left);
int fz=present;
if(fz!=0){
int gc=gcd(fz,fm);
ans1[id]=fz/gc;
ans2[id]=fm/gc;
}
else{
ans1[id]=0;
ans2[id]=1;
}
}
for(int i=1;i<=m;i++){
write(ans1[i]);
putchar('/');
write(ans2[i]);
puts("");
}
}