代码如下,本代码修改前已通过P1471
//ref: https://www.luogu.com.cn/blog/_post/104810
#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
long long a[maxn],val_sum[maxn],val_sqr[maxn],add[maxn];
long long be[maxn],n,m,len;
void print(long long l,long long r){
if(l==0){
printf("0/1\n");
return;
}
long long temp=__gcd(l,r);
printf("%lld/%lld\n",l/temp,r/temp);
}
void modify(long long from,long long to,long long ad){
for(long long i=from;i<=min(to,be[from]*len);i++) val_sqr[be[i]]+=2*a[i]*ad+ad*ad,a[i]+=ad,val_sum[be[i]]+=ad;
if(be[from]!=be[to]){
for(long long i=(be[to]-1)*len+1;i<=to;i++) val_sqr[be[i]]+=2*a[i]*ad+ad*ad,a[i]+=ad,val_sum[be[i]]+=ad;
}
for(long long i=be[from]+1;i<=be[to]-1;i++) add[i]+=ad;
}
long long query_sum(long long from,long long to,int fl){
long long cnt=0;
for(long long i=from;i<=min(to,be[from]*len);i++) cnt+=(a[i]+add[be[i]]);
if(be[from]!=be[to]){
for(long long i=(be[to]-1)*len+1;i<=to;i++) cnt+=(a[i]+add[be[i]]);
}
for(long long i=be[from]+1;i<=be[to]-1;i++) cnt+=(val_sum[i]+add[i]*len);
if(fl)print(cnt,to-from+1);
return cnt;
}
void query_sqr(long long from,long long to){
long long cnt=0, avg=query_sum(from,to,0);
for(long long i=from;i<=min(to,be[from]*len);i++) cnt+=(a[i]+add[be[i]])*(a[i]+add[be[i]]);
if(be[from]!=be[to]){
for(long long i=(be[to]-1)*len+1;i<=to;i++) cnt+=(a[i]+add[be[i]])*(a[i]+add[be[i]]);
}
for(long long i=be[from]+1;i<=be[to]-1;i++) cnt+=val_sqr[i]+2*val_sum[i]*add[i]+len*add[i]*add[i];
print(cnt*(to-from+1)-avg*avg,(to-from+1)*(to-from+1));
}
int main(){
scanf("%d%d",&n,&m);
len=sqrt(n);
for(long long i=1;i<=n;i++) be[i]=(i-1)/len+1;
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
val_sum[be[i]]+=a[i];
val_sqr[be[i]]+=a[i]*a[i];
}
while(m--){
long long op,l,r;
scanf("%d",&op);
if(op==1){
long long d;
scanf("%d%d%lld",&l,&r,&d);
modify(l,r,d);
}
if(op==2){
scanf("%d%d",&l,&r);
query_sum(l,r,1);
}
if(op==3){
scanf("%d%d",&l,&r);
query_sqr(l,r);
}
}
}