萌新求助,所有的警钟都看了,还是没找到问题
#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define lp p*2
#define rp p*2+1
#define mid ((l+r)>>1)
int n,m,op,x,y;
double a[N],t1[N<<3],t2[N<<3],lazy[N<<3],t,k;
void pushup(int p){
t1[p]=t1[lp]+t1[rp],t2[p]=t2[lp]+t2[rp];
}void build(int p,int l,int r){
if(l==r)t1[p]=a[l],t2[p]=a[l]*a[l];
else build(lp,l,mid),build(rp,mid+1,r),pushup(p);
}void pushdown(int p,int l,int r){
t2[lp]+=2.0*lazy[p]*t1[lp]+double(mid-l+1)*lazy[p]*lazy[p];
t1[lp]+=(mid-l+1)*lazy[p],lazy[lp]+=lazy[p];
t2[rp]+=2.0*lazy[p]*t1[rp]+double(r-mid)*lazy[p]*lazy[p];
t1[rp]+=(r-mid)*lazy[p],lazy[rp]+=lazy[p];
lazy[p]=0;
}void update(int p,int l,int r,int L,int R,double v){
if(L<=l&&r<=R){
t2[p]+=2.0*v*t1[p]+double(R-L+1)*v*v;
t1[p]+=double(R-L+1)*v,lazy[p]+=v;
return;
}pushdown(p,l,r);
if(L<=mid)update(lp,l,mid,L,R,v);
if(R>mid)update(rp,mid+1,r,L,R,v);
pushup(p);
}double query1(int p,int l,int r,int L,int R){
if(L<=l&&r<=R)return t1[p];
pushdown(p,l,r);
double sum=0;
if(L<=mid)sum+=query1(lp,l,mid,L,R);
if(R>mid)sum+=query1(rp,mid+1,r,L,R);
pushup(p);
return sum;
}double query2(int p,int l,int r,int L,int R){
if(L<=l&&r<=R)return t2[p];
pushdown(p,l,r);
double sum=0;
if(L<=mid)sum+=query2(lp,l,mid,L,R);
if(R>mid)sum+=query2(rp,mid+1,r,L,R);
pushup(p);
return sum;
}int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
cin>>op>>x>>y;
if(op==1)cin>>k,update(1,1,n,x,y,k);
if(op==2)printf("%.4lf\n",query1(1,1,n,x,y)/double(y-x+1));
if(op==3)t=query1(1,1,n,x,y)/double(y-x+1),printf("%.4lf\n",-t*t+query2(1,1,n,x,y)/double(y-x+1));
}return 0;
}