#include<cstdio>
#define ls k<<1
#define rs k<<1|1
int n,m;
double a[100010];
struct node
{
double val,lz;
}t1[100010<<2],t2[100010<<2];
void pushup(int k)
{
t1[k].val=t1[ls].val+t1[rs].val;
t2[k].val=t2[ls].val+t2[rs].val;
}
void pushdown(int k,int l,int r)
{
if(!t1[k].lz) return ;
int mid=(l+r)>>1;
t2[ls].lz+=t2[k].lz;
t2[rs].lz+=t2[k].lz;
t2[ls].val+=t1[ls].val*(t2[k].lz*2)+(mid-l+1)*(t2[k].lz*t2[k].lz);
t2[rs].val+=t1[rs].val*(t2[k].lz*2)+(r-mid)*(t2[k].lz*t2[k].lz);
t2[k].lz=0;
t1[ls].lz+=t1[k].lz;
t1[rs].lz+=t1[k].lz;
t1[ls].val+=(mid-l+1)*t1[k].lz;
t1[rs].val+=(r-mid)*t1[k].lz;
t1[k].lz=0;
}
void build(int k,int l,int r)
{
if(l==r)
{
t1[k].val=a[l];
t2[k].val=a[l]*a[l];
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void update(int k,int l,int r,int nl,int nr,int num)
{
if(l>=nl&&r<=nr)
{
t2[k].lz+=num;
t1[k].lz+=num;
t2[k].val+=t1[k].val*(num*2)+(r-l+1)*(num*num);
t1[k].val+=(r-l+1)*num;
return ;
}
pushdown(k,l,r);
int mid=(l+r)>>1;
if(nl<=mid) update(ls,l,mid,nl,nr,num);
if(nr>mid) update(rs,mid+1,r,nl,nr,num);
pushup(k);
}
double query(node tree[],int k,int l,int r,int nl,int nr)
{
if(l>=nl&&r<=nr) return tree[k].val;
pushdown(k,l,r);
double ans=0;
int mid=(l+r)>>1;
if(nl<=mid) ans+=query(tree,ls,l,mid,nl,nr);
if(nr>mid) ans+=query(tree,rs,mid+1,r,nl,nr);
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
build(1,1,n);
while(m--)
{
int op,l,r;
double num;
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%lf",&l,&r,&num);
update(1,1,n,l,r,num);
}
if(op==2)
{
scanf("%d%d",&l,&r);
printf("%.4lf\n",query(t1,1,1,n,l,r)*1.0/(r-l+1)*1.0);
}
if(op==3)
{
scanf("%d%d",&l,&r);
double len=(r-l+1)*1.0;
double _1=query(t1,1,1,n,l,r);
double _2=query(t2,1,1,n,l,r);
printf("%.4lf\n",(_2/len)-(_1/len)*(_1/len));
}
}
return 0;
}
全WA,求助
样例能过