只能过样例
#include<iostream>
#define mid ((l+r)/2)
using namespace std;
int n,m,opt,xx,yy,k;
double a[100005];
struct tree{
double sum,tag;
double squ,tag_squ;
}tr[800005];
void pushup(int x){
tr[x].sum=tr[x*2].sum+tr[x*2+1].sum;
tr[x].squ=tr[x*2].squ+tr[x*2+1].squ;
}
void pushdown(int x,int l,int r){
if(tr[x].tag_squ!=0.0){
tr[2*x].tag_squ+=tr[x].tag_squ;
tr[2*x+1].tag_squ+=tr[x].tag_squ;
tr[2*x].squ+=tr[2*x].sum*(tr[x].tag_squ*2)+(mid-l+1)*(tr[x].tag_squ*tr[x].tag_squ);
tr[2*x+1].squ+=tr[2*x+1].sum*(tr[x].tag_squ*2)+(r-mid)*(tr[x].tag_squ*tr[x].tag_squ);
tr[x].tag_squ=0;
tr[2*x].tag+=tr[x].tag;
tr[2*x+1].tag+=tr[x].tag;
tr[2*x].sum+=tr[x].tag*(mid-l+1);
tr[2*x+1].sum+=tr[x].tag*(r-mid);
tr[x].tag=0;
}
}
void build(int x,int l,int r){
if(l==r){
tr[x].sum=a[l];
tr[x].squ=a[l]*a[l];
return ;
}
build(x*2,l,mid);
build(x*2+1,mid+1,r);
pushup(x);
}
double query_ave(int x,int l,int r,int from,int to){
double ans=0;
if(from<=l&&r<=to){
ans=tr[x].sum;
return ans;
}
pushdown(x,l,r);
if(from<=mid)ans+=query_ave(x*2,l,mid,from,to);
if(mid<to)ans+=query_ave(x*2+1,mid+1,r,from,to);
return ans;
}
double query_squ(int x,int l,int r,int from,int to){
double ans=0;
if(from<=l&&r<=to){
ans=tr[x].squ;
return ans;
}
pushdown(x,l,r);
if(from<=mid)ans+=query_squ(x*2,l,mid,from,to);
if(mid<to)ans+=query_squ(x*2+1,mid+1,r,from,to);
return ans;
}
void update(int x,int l,int r,int from,int to,double v){
if(from<=l&&r<=to){
tr[x].tag_squ+=v;
tr[x].squ+=tr[x].sum*(v*2)+(r-l+1)*v*v;
tr[x].tag+=v;
tr[x].sum+=(r-l+1)*v;
return ;
}
pushdown(x,l,r);
if(from<=mid)update(x*2,l,mid,from,to,v);
if(mid<to)update(x*2+1,mid+1,r,from,to,v);
pushup(x);
}
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++){
cin>>opt;
if(opt==1){
cin>>xx>>yy>>k;
update(1,1,n,xx,yy,k);
}
if(opt==2){
cin>>xx>>yy;
printf("%.4lf\n",query_ave(1,1,n,xx,yy)*1.0/(yy-xx+1));
}
if(opt==3){
cin>>xx>>yy;
double p=query_squ(1,1,n,xx,yy)*1.0/(yy-xx+1),q=query_ave(1,1,n,xx,yy)*1.0/(yy-xx+1);
double ans=p-q*q;
printf("%.4lf\n",ans*1.0);
}
}
return 0;
}
/*
1 5 4 2 3
2 5 4 2 3
2 4 4 2 3
*/