invalid memory reference
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e5+7;
const int inf=0x6f6f6f;
const int hs=10000019;
int n,a[maxn],m;
//函数
int sum[4*maxn];
int sum2[4*maxn];
int add[4*maxn];
inline int ls(int a){
return 2*a;
}
inline int rs(int a){
return 2*a+1;
}
inline void pushup(int a){
sum[a]=sum[ls(a)]+sum[rs(a)];
sum2[a]=sum2[ls(a)]+sum2[rs(a)];
}
void build(int l,int r,int p){
add[p]=0;
if(l==r){
sum[p]=a[l];
sum2[p]=a[l]*a[l];
return;
}
int mid=(l+r)/2;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
pushup(p);
return;
}
void f(int l,int r,int p,int k){
add[p]+=k;
sum2[p]+=(r-l+1)*k*k+2*sum[p]*k;
sum[p]+=k*(r-l+1);
return;
}
void pushdown(int l,int r,int p){
int mid=(l+r)/2;
f(l,mid,ls(p),add[p]);
f(mid+1,r,rs(p),add[p]);
add[p]=0;
return;
}
void ad(int nl,int nr,int l,int r,int p,int k){
if(nl<=l&&r<=nr){
add[p]+=k;
sum2[p]+=(r-l+1)*k*k+2*sum[p]*k;
sum[p]+=k*(r-l+1);
return;
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=nl){
ad(nl,nr,l,mid,ls(p),k);
}
if(mid<nr){
ad(nl,nr,mid+1,r,rs(p),k);
}
pushup(p);
return;
}
int query(int nl,int nr,int l,int r,int p){
int ret=0;
if(nl<=l&&r<=nr){
return sum[p];
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=nl){
ret+=query(nl,nr,l,mid,ls(p));
}
if(mid<nr){
ret+=query(nl,nr,mid+1,r,rs(p));
}
return ret;
}
int query2(int nl,int nr,int l,int r,int p){
int ret=0;
if(nl<=l&&r<=nr){
return sum2[p];
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=nl){
ret+=query2(nl,nr,l,mid,ls(p));
}
if(mid<nr){
ret+=query2(nl,nr,mid+1,r,rs(p));
}
return ret;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,n,1);
while(m--){
int opt=0,x=0,y=0,k=0;
scanf("%lld",&opt);
if(opt==1){
scanf("%lld%lld%lld",&x,&y,&k);
ad(x,y,1,n,1,k);
}
else if(opt==2){
scanf("%lld%lld",&x,&y);
printf("%.4f\n",(float)query(x,y,1,n,1)/(float)(y-x+1));
}
else{
scanf("%lld%lld",&x,&y);
float tem=query(x,y,1,n,1);
float tem2=query2(x,y,1,n,1);
float num=y-x+1;
//cout<<tem<<" "<<tem2<<endl;
//cout<<num*(tem/num)*(tem/num)<<" "<<tem2<<" "<<-2*(tem/num)*tem<<endl;
printf("%.4f\n",(num*(tem/num)*(tem/num)+tem2-2*(tem/num)*tem)/num);
}
}
return 0;
}