题目
#include<bits/stdc++.h>
#define N 100005
using namespace std;
double sum_1[N*4],sum_2[N*4],n,m,a[N],lazy[N*4],op,l1,r1,v1;
void pushup(int k){
sum_1[k]=sum_1[k<<1]+sum_1[k<<1|1];
sum_2[k]=sum_2[k<<1]+sum_2[k<<1|1];
}
void add(int k,int l,int r,double v){
sum_2[k]+=2*v*sum_1[k]+(r-l+1)*v*v;
sum_1[k]+=(r-l+1)*v;
lazy[k]+=v;
}
void pushdown(int k,int l,int r){
if(lazy[k]==0){
return;
}
int mid=(l+r)>>1;
add(k<<1,l,mid,lazy[k]);
add(k<<1|1,mid+1,r,lazy[k]);
lazy[k]=0;
}
void build(int k,int l,int r){
if(l==r){
sum_1[k]=a[l];
sum_2[k]=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 modify(int k,int l,int r,int x,int y,double v){
if(r<x||l>y) return;
if(x<=l&&r<=y){
add(k,l,r,v);
return;
}
int mid=(l+r)>>1;
pushdown(k,l,r);
modify(k<<1,l,mid,x,y,v);
modify(k<<1|1,mid+1,r,x,y,v);
pushup(k);
}
int query_variance(int k,int l,int r,int x,int y){
if(x<=l&&r<=y){
return sum_2[k];
}
pushdown(k,l,r);
int mid=(l+r)>>1;
double res=0;
if(x<=mid) res+=query_variance(k<<1,l,mid,x,y);
if(mid<y) res+=query_variance(k<<1|1,mid+1,r,x,y);
return res;
}
int query_Average_number(int k,int l,int r,int x,int y){
if(x<=l&&r<=y){
return sum_1[k];
}
pushdown(k,l,r);
int mid=(l+r)>>1;
double res=0;
if(x<=mid) res+=query_Average_number(k<<1,l,mid,x,y);
if(mid<y) res+=query_Average_number(k<<1|1,mid+1,r,x,y);
pushup(k);
return res;
}
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>>op;
if(op==1){
cin>>l1>>r1>>v1;
modify(1,1,n,l1,r1,v1);
}
else if(op==2){
cin>>l1>>r1;
double Average_number=1.0*query_Average_number(1,1,n,l1,r1)/(r1-l1+1);
printf("%.4lf\n",Average_number);
}
else if(op==3){
cin>>l1>>r1;
double Average_number=1.0*query_Average_number(1,1,n,l1,r1)/(r1-l1+1);
double variance=1.0*query_variance(1,1,n,l1,r1)/(r1-l1+ 1)-Average_number*Average_number;
printf("%.4lf\n",variance);
}
}
}