蒟蒻WA了,有没有大佬帮忙看一下qwq
#include <bits/stdc++.h>
#define ll long long
#define ls p<<1
#define rs p<<1|1
using namespace std;
int n,m,a[100010];
struct NODE
{
double sum1,sum2,add;
}t[400010];
void push_up(int p)
{
t[p].sum1=t[ls].sum1+t[rs].sum1;
t[p].sum2=t[ls].sum2+t[rs].sum2;
}
void build(int p,int l,int r)
{
if(l==r)
{
t[p].sum1=a[l];
t[p].sum2=a[l]*a[l];
return;
}
int mid=(l+r)/2;
build(ls,l,mid);
build(rs,mid+1,r);
push_up(p);
}
void push_down(int p,int l,int r)
{
if(t[p].add!=0)
{
double add1=t[p].add;
t[ls].add+=add1;
t[rs].add+=add1;
int mid=(l+r)/2;
t[ls].sum2=t[ls].sum2+add1*2*t[ls].sum1+add1*add1*(mid-l+1);
t[ls].sum1=t[ls].sum1+add1*(mid-l+1);
t[rs].sum2=t[rs].sum2+add1*2*t[rs].sum1+add1*add1*(r-mid);
t[rs].sum1=t[rs].sum1+add1*(r-mid);
t[p].add=0;
}
}
void modify(int p,int l,int r,int x,int y,int k)
{
if(x<=l&&r<=y)
{
t[p].add+=k;
t[p].sum2=t[p].sum2+2*k*t[p].sum1+k*k*(r-l+1);
t[p].sum1+=k*(r-l+1);
return;
}
int mid=(l+r)/2;
push_down(p,l,r);
if(x<=mid)
{
modify(ls,l,mid,x,y,k);
}
if(y>mid)
{
modify(rs,mid+1,r,x,y,k);
}
push_up(p);
}
NODE query(int p,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return t[p];
}
int mid=(l+r)/2;
push_down(p,l,r);
NODE res{0,0,0};
if(x<=mid)
{
NODE left=query(ls,l,mid,x,y);
res.sum1+=left.sum1;
res.sum2+=left.sum2;
}
if(y>mid)
{
NODE right=query(rs,mid+1,r,x,y);
res.sum1+=right.sum1;
res.sum2+=right.sum2;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
while(m--)
{
int op,l,r;
cin>>op>>l>>r;
if(op==1)
{
int k;
cin>>k;
modify(1,1,n,l,r,k);
}
if(op==2)
{
NODE ans=query(1,1,n,l,r);
cout<<fixed<<setprecision(4)<<ans.sum1/(r-l+1)<<"\n";
}
if(op==3)
{
NODE ans=query(1,1,n,l,r);
double res=ans.sum1/(r-l+1),len=r-l+1;
//cout<<ans.sum1<<" "<<ans.sum2<<"\n";
cout<<fixed<<setprecision(4)<<(ans.sum2-2*res*ans.sum1+res*res*(r-l+1))/len<<"\n";
}
}
return 0;
}