#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1)
#define ls 2*k
#define rs 2*k+1
#define lk (mid-l+1)
#define rk (r-mid)
#define len (r-l+1)
#define db double
int n,m;
db a[500005],sum[500005],pfh[500005],add[500005];
void pushup(int k){
sum[k]=sum[ls]+sum[rs];
pfh[k]=pfh[ls]+pfh[rs];
}
void pushdown(int k,int l,int r){
if(add[k]>0){
pfh[ls]+=lk*add[k]*add[k]+2.0*add[k]*sum[ls],pfh[rs]+=rk*add[k]*add[k]+2.0*add[k]*sum[rs];
sum[ls]+=lk*add[k],sum[rs]+=rk*add[k];
add[ls]+=add[k],add[rs]+=add[k],add[0]=0;
}
}
void init(int k,int l,int r){
if(l==r){
sum[k]=a[l],pfh[k]=a[l]*a[l];
return;
}init(ls,l,mid),init(rs,mid+1,r),pushup(k);
}
void up(int k,int l,int r,int L,int R,db v){
if(L<=l&&r<=R){
pfh[k]+=len*v*v+2*v*sum[k],sum[k]+=len*v,add[k]+=v;
return;
}pushdown(k,l,r);
if(L<=mid)up(ls,l,mid,L,R,v);
if(R>=mid+1)up(rs,mid+1,r,L,R,v);
pushup(k);
}
db q1(int k,int l,int r,int L,int R){
if(L<=l&&r<=R)return sum[k];
pushdown(k,l,r);
return (L<=mid?q1(ls,l,mid,L,R):0)+(R>=mid+1?q1(rs,mid+1,r,L,R):0);
}
db q2(int k,int l,int r,int L,int R){
if(L<=l&&r<=R)return pfh[k];
pushdown(k,l,r);
return (L<=mid?q2(ls,l,mid,L,R):0)+(R>=mid+1?q2(rs,mid+1,r,L,R):0);
}
signed main() {
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
init(1,1,n);
int op;
for(double x,y,k;m--;m){
cin>>op;
if(op==1){
cin>>x>>y>>k;
up(1,1,n,x,y,k);
}else if(op==2){
cin>>x>>y;
cout<<fixed<<setprecision(4)<<q1(1,1,n,x,y)/(y-x+1)<<"\n";
}else{
cin>>x>>y;
cout<<fixed<<setprecision(4)<<q2(1,1,n,x,y)/(y-x+1)-(q1(1,1,n,x,y)/(y-x+1)*q1(1,1,n,x,y)/(y-x+1))<<"\n";
}
}
return 0;
}