平方和有点问题,但是没找到错误,求大佬帮条
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef double LL;
const int N=1e5+10;
struct Node{
int l,r;
LL sum,powsum,add;
}tr[N*4];
int n,m;
double a[N];
void pushup(Node &root,Node &left,Node &right){
root.sum=left.sum+right.sum;
root.powsum=left.powsum+right.powsum;
}
void pushup(int u){
pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}
void pushdown(int u){
Node &root=tr[u],&l=tr[u<<1],&r=tr[u<<1|1];
if(root.add){
LL d=root.add;
l.sum+=(LL)(l.r-l.l+1)*d;
r.sum+=(LL)(r.r-r.l+1)*d;
l.powsum+=2*d*l.sum+(LL)(l.r-l.l+1)*d*d;
r.powsum+=2*d*r.sum+(LL)(r.r-r.l+1)*d*d;
l.add+=d;
r.add+=d;
root.add=0;
}
}
void build(int u,int l,int r){
tr[u]={l,r,0,0,0};
if(l==r) tr[u]={l,r,a[l],a[l]*a[l],0};
else{
int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
}
void modify(int u,int l,int r,double d){
if(tr[u].l>=l&&tr[u].r<=r){
Node &root=tr[u];
tr[u].add+=d;
tr[u].sum+=(LL)(tr[u].r-tr[u].l+1)*d;
root.powsum+=2*d*root.sum+(LL)(root.r-root.l+1)*d*d;
}
else{
int mid=tr[u].l+tr[u].r>>1;
pushdown(u);
if(l<=mid) modify(u<<1,l,r,d);
if(r>mid) modify(u<<1|1,l,r,d);
pushup(u);
}
}
Node query(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u];
}
int mid=tr[u].l+tr[u].r>>1;
pushdown(u);
Node res,left,right;
if(l<=mid) left=query(u<<1,l,r);
if(r>mid) right=query(u<<1|1,l,r);
pushup(res,left,right);
return res;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
int x,y,op;
cin>>op>>x>>y;
if(op==1){
LL d;
cin>>d;
modify(1,x,y,d);
}
else if(op==2){
Node t=query(1,x,y);
printf("%.4lf\n",(LL)t.sum/(y-x+1));
}
else{
Node root=query(1,x,y);
double ave=(LL)root.sum/(y-x+1);
double s=(double)root.powsum/(y-x+1)-ave*ave;
printf("%.4lf\n",s);
}
}
return 0;
}