#include<bits/stdc++.h>
using namespace std;
#define lz p<<1
#define rz p<<1|1
#define mid (l+r)/2
const int N=1e5+10;
double n,m,a[N],tr[N*4],tr2[N*4],tag[N*4];
void build(int l,int r,int p)
{
if(l==r){
tr[p]=a[l];
tr2[p]=a[l]*a[l];
return;
}
build(l,mid,lz);
build(mid+1,r,rz);
tr[p]+=tr[lz]+tr[rz];
tr2[p]+=tr2[lz]+tr2[rz];
return;
}
void down(int l,int r,int p){
tag[rz]+=tag[p];
tag[lz]+=tag[p];
tr2[lz]+=2*tag[p]*tr[lz]+(mid-l+1)*tag[p]*tag[p];
tr2[rz]+=2*tag[p]*tr[rz]+(r-mid)*tag[p]*tag[p];
tr[lz]+=tag[p]*(mid-l+1);
tr[rz]+=tag[p]*(r-mid);
tag[p]=0;
}
void update(int bg,int ed,double k,int l,int r,int p)
{
if(bg<=l&&ed>=r){
tr2[p]+=tr[p]*2*k+k*k*(r-l+1);
tr[p]+=(r-l+1)*k;
tag[p]+=k;
return;
}
down(l,r,p);
if(bg<=mid)update(bg,ed,k,l,mid,lz);
if(ed>mid)update(bg,ed,k,mid+1,r,rz);
}
double getsum2(int bg,int ed,int l,int r,int p)
{
down(l,r,p);
if(bg<=l&&r<=ed)return tr[p];
double sum=0;
if(bg<=mid)sum=getsum2(bg,ed,l,mid,lz);
if(ed>mid)sum+=getsum2(bg,ed,mid+1,r,rz);
return sum;
}
double getsum3(int bg,int ed,int l,int r,int p)
{
down(l,r,p);
if(bg<=l&&r<=ed)return tr2[p];
double sum=0;
if(bg<=mid)sum=getsum3(bg,ed,l,mid,lz);
if(ed>=mid)sum+=getsum3(bg,ed,mid+1,r,rz);
return sum;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
for(int i=1;i<=m;i++){
int op,x,y;
cin>>op>>x>>y;
if(op==1){
double z;
cin>>z;
update(x,y,z,1,n,1);
}
else if(op==2){
printf("%.4lf\n",getsum2(x,y,1,n,1)/((y-x+1)*1.0));
}
else {
double sum1=getsum3(x,y,1,n,1)/((y-x+1)*1.0);
double sum2=getsum2(x,y,1,n,1)/((y-x+1)*1.0);
printf("%.4lf\n",sum1-sum2*sum2);
}
}
return 0;
}