#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005],f[1000005];
struct node{
double num,sum,x,y,psum;
}tree[1000005];
void build(int x,int y,int p){
if(x==y){
tree[p].num=a[x]*1.0;
tree[p].sum=a[x]*a[x]*1.0;
tree[p].psum=a[x]*1.0;
tree[p].x=x;
tree[p].y=y;
return ;
}
int mid=(x+y)/2;
build(x,mid,p*2);
build(mid+1,y,p*2+1);
tree[p].num=tree[p*2].num+tree[p*2+1].num;
tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;
}
void down(int x,int y,int p){
tree[p*2].num+=(tree[p*2].y-tree[p*2].x+1)*f[p];
tree[p*2+1].num+=(tree[p*2+1].y-tree[p*2+1].x+1)*f[p];
tree[p*2].psum+=f[p];
tree[p*2+1].psum+=f[p];
if(f[p]>0) tree[p*2].sum+=((tree[p*2].y-tree[p*2].x+1)*(f[p]*f[p])+f[p]*2*tree[p*2].num);
if(f[p]>0) tree[p*2+1].sum+=((tree[p*2+1].y-tree[p*2+1].x+1)*(f[p]*f[p])+f[p]*2*tree[p*2+1].num);
if(f[p]<0) tree[p*2].sum+=((tree[p*2].y-tree[p*2].x+1)*(f[p]*f[p])-f[p]*2*tree[p*2].num);
if(f[p]<0) tree[p*2+1].sum+=((tree[p*2+1].y-tree[p*2+1].x+1)*(f[p]*f[p])-f[p]*2*tree[p*2+1].num);
f[p*2]+=f[p];
f[p*2+1]+=f[p];
f[p]=0;
}
void add(int x,int y,int s,int t,int w,int p){
if(x>=s&&y<=t){
tree[p].sum+=((tree[p].y-tree[p].x+1)*(f[p]*f[p])+2*f[p]*tree[p].num);
tree[p].num+=(x-y+1)*w*1.0;
tree[p].psum+=w*1.0;
f[p]+=w*1.0;
return ;
}
int mid=(x+y)/2;
down(x,y,p);
if(mid>=s) add(x,mid,s,t,w,p*2);
if(mid<t) add(mid+1,y,s,t,w,p*2+1);
tree[p].num=tree[p*2].num+tree[p*2+1].num;
tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;
}
double find(int x,int y,int s,int t,int p){
if(x>=s&&y<=t){
return tree[p].num;
}
double mid=(x+y)/2,sum=0;
down(x,y,p);
if(mid>=s) sum=find(x,mid,s,t,p*2);
if(mid<t) sum+=find(mid+1,y,s,t,p*2+1);
return sum;
}
double findd(int x,int y,int s,int t,int p){
if(x>=s&&y<=t){
return tree[p].sum;
}
double mid=(x+y)/2,ssum=0;
down(x,y,p);
if(mid>=s) ssum=findd(x,mid,s,t,p*2);
if(mid<t) ssum+=findd(mid+1,y,s,t,p*2+1);
return ssum;
}
signed 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 x,y,op;
cin>>op;
if(op==1){
int x,y,k;
cin>>x>>y>>k;
add(1,n,x,y,k,1);
}
if(op==2){
int x,y;
cin>>x>>y;
cout<<find(1,n,x,y,1)*1.0/(y-x+1)<<endl;
}
if(op==3){
int x,y;
cin>>x>>y;
cout<<(findd(1,n,x,y,1)-(2*find(1,n,x,y,1)*1.0/(y-x+1)*find(1,n,x,y,1))+(y-x+1)*find(1,n,x,y,1)*1.0/(y-x+1)*find(1,n,x,y,1)*1.0/(y-x+1))*1.0/(y-x+1)<<endl;
}
}
return 0;
}