#include<bits/stdc++.h>
#define lc q<<1
#define rc q<<1|1
using namespace std;
const int N=1e5+5;
double w[N];
int n,m,op,c1,c2;
double c3;
struct node{
int l,r,len;
double sum,psum;
double add;
}tr[N*4];
void up(int q){
tr[q].sum=tr[lc].sum+tr[rc].sum;
tr[q].psum=tr[lc].psum+tr[rc].psum;
}
void lazy(int q){
tr[q].psum=tr[q].psum+(2.0*tr[q].sum*tr[q].add)+((double)tr[q].len*tr[q].add*tr[q].add);
tr[q].sum+=(double)tr[q].len*tr[q].add;
}
void down(int q){
if(tr[q].add){
tr[lc].add+=tr[q].add;
tr[rc].add+=tr[q].add;
lazy(lc);
lazy(rc);
tr[q].add=0;
}
}
void build(int q,int l,int r){
tr[q].l=l,tr[q].r=r;
tr[q].len=r-l+1;
if(l==r){
tr[q].sum=w[l];
tr[q].psum=w[l]*w[l];
} else {
int mid=(l+r)/2;
build(lc,l,mid);
build(rc,mid+1,r);
up(q);
}
}
void queryadd(int q,int l,int r,double v){
if(l<=tr[q].l&&tr[q].r<=r){
tr[q].psum=tr[q].psum+(2.0*tr[q].sum*v)+((double)tr[q].len*v*v);
tr[q].sum+=(double)tr[q].len*v;
tr[q].add+=v;
} else {
down(q);
int mid=(tr[q].l+tr[q].r)/2;
if(l<=mid){
queryadd(lc,l,r,v);
}
if(r>mid){
queryadd(rc,l,r,v);
}
up(q);
}
}
double querysum(int q,int l,int r){
if(l<=tr[q].l&&tr[q].r<=r){
return tr[q].sum;
} else {
down(q);
int mid=(tr[q].l+tr[q].r)/2;
double ans=0;
if(l<=mid){
ans+=querysum(lc,l,r);
}
if(r>mid){
ans+=querysum(rc,l,r);
}
return ans;
}
}
double queryqsum(int q,int l,int r){
if(l<=tr[q].l&&tr[q].r<=r){
return tr[q].psum;
} else {
down(q);
int mid=(tr[q].l+tr[q].r)/2;
double ans=0;
if(l<=mid){
ans+=queryqsum(lc,l,r);
}
if(r>mid){
ans+=queryqsum(rc,l,r);
}
return ans;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%lf",&w[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>op;
if(op==1) scanf("%d%d%lf",&c1,&c2,&c3),queryadd(1,c1,c2,c3);
if(op==2){
scanf("%d%d",&c1,&c2);
double s1=querysum(1,c1,c2)/(double)(c2-c1+1);
printf("%.4lf",s1),cout<<'\n';
}
if(op==3){
scanf("%d%d",&c1,&c2);
double s2=queryqsum(1,c1,c2);
double s3=querysum(1,c1,c2);
double le=(double)(c2-c1+1);
double s4=((s2*le)-(s3*s3))/(le*le);
printf("%.4lf",s4),cout<<'\n';
}
for(int i=1;i<n*3;i++){
down(i);
cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].sum<<" "<<tr[i].psum<<endl;
}
cout<<"------"<<endl;
}
return 0;
}