rt,能过样例,但是WA 0pts
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
double a[maxn],sum2[maxn*4],sum[maxn*4],addmark[maxn*4],addmark2[maxn*4];
int n,m;
void build(int k,int l,int r)
{
if(l==r)
{
sum[k]=a[l];
sum2[k]=a[l]*a[l];
return ;
}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
sum[k]=sum[k*2]+sum[k*2+1];
sum2[k]=sum2[k*2]+sum2[k*2+1];
}
void add1(int k,int l,int r,double v)
{
addmark[k]+=v;
sum[k]+=v*(r-l+1);
}
void add2(int k,int l,int r,double v)
{
addmark2[k]+=v;
sum2[k]+=sum[k]*2*v+v*v*(r-l+1);
}
void pushdown(int k,int l,int r)
{
if(addmark[k]==0&&addmark2[k]==0) return ;
int mid=(l+r)/2;
add2(k*2,l,mid,addmark2[k*2]);
add2(k*2+1,mid+1,r,addmark2[k*2+1]);
add1(k*2,l,mid,addmark[k*2]);
add1(k*2+1,mid+1,r,addmark[k*2+1]);
addmark[k]=0.0;
addmark2[k]=0.0;
}
void modify(int k,int l,int r,int x,int y,double v)
{
if(l>=x&&r<=y)
{
add2(k,l,r,v);
add1(k,l,r,v);
return ;
}
int mid=(l+r)/2;
pushdown(k,l,r);
if(x<=mid)
{
modify(k*2,l,mid,x,y,v);
}
if(y>mid)
{
modify(k*2+1,mid+1,r,x,y,v);
}
sum[k]=sum[k*2]+sum[k*2+1];
sum2[k]=sum2[k*2]+sum2[k*2+1];
}
double query(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y)
{
return sum[k];
}
int mid=(l+r)/2;
pushdown(k,l,r);
double res=0.0;
if(x<=mid)
{
res+=query(k*2,l,mid,x,y);
}
if(y>mid)
{
res+=query(k*2+1,mid+1,r,x,y);
}
return res;
}
double query2(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y)
{
return sum2[k];
}
int mid=(l+r)/2;
pushdown(k,l,r);
double res=0.0;
if(x<=mid)
{
res+=query2(k*2,l,mid,x,y);
}
if(y>mid)
{
res+=query2(k*2+1,mid+1,r,x,y);
}
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int opt;
cin>>opt;
if(opt==1)
{
int x,y;
double k;
cin>>x>>y>>k;
modify(1,1,n,x,y,k);
}
else if(opt==2)
{
int x,y;
cin>>x>>y;
printf("%.4lf\n",query(1,1,n,x,y)/(y-x+1));
}
else
{
int x,y;
cin>>x>>y;
double ab=query(1,1,n,x,y)/(y-x+1);
printf("%.4lf\n",1.0/(y-x+1)*query2(1,1,n,x,y)-ab*ab);
}
}
return 0;
}