正常思路
#include <bits/stdc++.h>
#define N 500005
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
int n,m;
double a[N];
struct apple{
int l,r;
double sum2,sum,add;
};
apple t[N<<2];
#define l(x) t[x].l
#define r(x) t[x].r
#define sum2(x) t[x].sum2
#define sum(x) t[x].sum
#define add(x) t[x].add
void build(int p,int l,int r){
l(p)=l,r(p)=r;
if (l==r){
sum(p)=a[l];
sum2(p)=a[l]*a[l];
return;
}
int mid=l(p)+r(p)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
sum(p)=sum(ls(p))+sum(rs(p));
sum2(p)=sum2(ls(p))+sum2(rs(p));
}
void push_down(int p){
if (add(p)!=0){
sum2(ls(p))+=1.0*(r(ls(p))-l(ls(p))+1)*add(p)*add(p)+2*sum(ls(p))*add(p);
sum(ls(p))+=1.0*(r(ls(p))-l(ls(p))+1)*add(p);
sum2(rs(p))+=1.0*(r(rs(p))-l(rs(p))+1)*add(p)*add(p)+2*sum(rs(p))*add(p);
sum(rs(p))+=1.0*(r(rs(p))-l(rs(p))+1)*add(p);
add(ls(p))+=add(p);
add(rs(p))+=add(p);
add(p)=0;
}
}
void modify(int p,int l,int r,double k){
if (l<=l(p)&&r(p)<=r){
sum2(p)+=1.0*(r(p)-l(p)+1)*k*k+2*sum(p)*k;
sum(p)+=1.0*(r(p)-l(p)+1)*k;
add(p)+=k;
return;
}
int mid=l(p)+r(p)>>1;
if (l<=mid){
modify(ls(p),l,r,k);
}
if (mid<r){
modify(rs(p),l,r,k);
}
sum(p)=sum(ls(p))+sum(rs(p));
sum2(p)=sum2(ls(p))+sum2(rs(p));
}
double query(int p,int l,int r){
if (l<=l(p)&&r(p)<=r){
return sum(p);
}
push_down(p);
int mid=l(p)+r(p)>>1;
double ans=0;
if (l<=mid){
ans+=query(ls(p),l,r);
}
if (mid<r){
ans+=query(rs(p),l,r);
}
return ans;
}
double query2(int p,int l,int r){
if (l<=l(p)&&r(p)<=r){
return sum2(p);
}
push_down(p);
int mid=l(p)+r(p)>>1;
double ans=0;
if (l<=mid){
ans+=query2(ls(p),l,r);
}
if (mid<r){
ans+=query2(rs(p),l,r);
}
return ans;
}
void dfs(int p){
cout<<p<<" "<<l(p)<<" "<<r(p)<<" "<<sum(p)<<" "<<sum2(p)<<" "<<add(p)<<endl;
if (l(p)==r(p)) return;
dfs(ls(p)),dfs(rs(p));
}
signed main (){
int i,op,c,d;
double e,k,k2,avg;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++){
scanf("%lf",&a[i]);
}
build(1,1,n);
for (i=1;i<=m;i++){
scanf("%d%d%d",&op,&c,&d);
if (op==1){
scanf("%lf",&e);
modify(1,c,d,e);
}
if (op==2){
k=query(1,c,d);
printf("%.4lf\n",k/(d-c+1));
}
if (op==3){
//dfs(1);
k=query(1,c,d),k2=query2(1,c,d);
avg=1.0*k/(d-c+1);
printf("%.4lf\n",1.0*(k2-2*avg*k+avg*avg*(d-c+1))/(d-c+1));
}
}
return 0;
}