如题,喜提0pts求解
#define N 100010
int n,m;
double num[N];
struct Node {
int l,r;
double wei,sqr,tag;
}tr[N<<2];
inline int Len(int k){
return tr[k].r-tr[k].l+1;
}
inline void Pushup(int k){
tr[k].wei=tr[ls].wei+tr[rs].wei;
tr[k].sqr=tr[ls].sqr+tr[rs].sqr;
}
void Build(int k,int l,int r){
tr[k].l=l,tr[k].r=r,tr[k].tag=0;
if(l==r){
tr[k].wei=num[l];
tr[k].sqr=tr[k].wei*tr[k].wei;
return;
}
Build(ls,l,nmid);
Build(rs,nmid+1,r);
Pushup(k);
}
inline void Pushdn(int k){
if(tr[k].tag){
int len=Len(k);
tr[ls].sqr+=2*tr[k].tag*tr[ls].wei+(len-len/2)*tr[k].tag*tr[k].tag;
tr[rs].sqr+=2*tr[k].tag*tr[rs].wei+(len/2)*tr[k].tag*tr[k].tag;
tr[ls].wei+=(len-len/2)*tr[k].tag;
tr[rs].wei+=(len/2)*tr[k].tag;
tr[ls].tag+=tr[k].tag;
tr[rs].tag+=tr[k].tag;
tr[k].tag=0;
}
}
void Modify(int k,int l,int r,double add){
if(l<=tr[k].l&&tr[k].r<=r){
tr[k].tag+=add;
tr[k].sqr+=2*add*tr[k].wei+add*add*Len(k);
tr[k].wei+=add*Len(k);
return;
}
Pushdn(k);
if(l<=tmid)Modify(ls,l,r,add);
if(tmid+1<=r)Modify(rs,l,r,add);
Pushup(k);
}
double Queryw(int k,int l,int r){
if(l<=tr[k].l&&tr[k].r<=r){
return tr[k].wei;
}
double ans=0;
if(l<=tmid)ans+=Queryw(ls,l,r);
if(tmid<r)ans+=Queryw(rs,l,r);
return ans;
}
double Querys(int k,int l,int r){
if(l<=tr[k].l&&tr[k].r<=r){
return tr[k].sqr;
}
double ans=0;
if(l<=tmid)ans+=Querys(ls,l,r);
if(tmid<r)ans+=Querys(rs,l,r);
return ans;
}
int main(){
Read(n),Read(m);
for(rg int i=1;i<=n;i++)cin>>num[i];
Build(1,1,n);
for(rg int i=1;i<=m;i++){
int opt,x,y;
double k;
Read(opt),Read(x),Read(y);
if(opt==1){
cin>>k;
Modify(1,x,y,k);
}else if(opt==2){
printf("%.4lf\n",Queryw(1,x,y)/(y-x+1));
}else {
double sum=Querys(1,x,y)/(y-x+1),avr=Queryw(1,x,y)/(y-x+1);
printf("%.4lf\n",sum-avr*avr);
}
}
return 0;
}