#include<cstdio>
#include<iostream>
#define dd double
using namespace std;
const int MAXN = 1E5+114;
dd ls[MAXN*4];
dd lsq[MAXN*4];
dd laz[MAXN*4];
dd num[MAXN];
int n,m;
void pushup(int u){
ls[u] = ls[u*2]+ls[u*2+1];
lsq[u] = lsq[u*2]+lsq[u*2+1];
}
void pushdown(int u,int x){
if(laz[u]){
lsq[u*2]+=2*laz[u]*ls[u*2]+(x-x/2)*laz[u]*laz[u];
lsq[u*2+1] += 2*laz[u]*ls[u*2+1]+(x/2)*laz[u]*laz[u];
ls[u*2] += (x-x/2)*laz[u];
ls[u*2+1] += (x/2)*laz[u];
laz[u*2]+=laz[u];
laz[u*2+1]+=laz[u];
laz[u] = 0;
}
}
void build(const int u,int l,int r){
if(l==r){
scanf("%lf",&ls[u]);
lsq[u] = ls[u]*ls[u];
return;
}
int m = (l+r)>>1;
build(u*2,l,m);
build(u*2+1,m+1,r);
pushup(u);
}
dd get(int u,int L,int R,int l,int r){
if(L>=l && R<=r) return ls[u];
pushdown(u,R-L+1);
int m = (L+R)>>1;
dd ret = 0;
if(m>=l) ret += get(u*2,L,m,l,r);
if(m<r) ret += get(u*2+1,m+1,R,l,r);
return ret;
}
dd get_b(int u,int L,int R,int l,int r){
if(L>=l && R<=r) return lsq[u];
pushdown(u,R-L+1);
int m = (L+R)>>1;
dd ret = 0;
if(m>=l) ret += get(u*2,L,m,l,r);
if(m<r) ret += get(u*2+1,m+1,R,l,r);
return ret;
}
void addd(int u,int L,int R,int l,int r,dd x){
if(L>=l && R<=r){
laz[u] += x;
lsq[u]+=2*x*ls[u]+x*x*(R-L+1);
ls[u]+=(R-L+1)*x;
}
else{
pushdown(u,R-L+1);
int m = (L+R)>>1;
if(l<=m) addd(u*2,L,m,l,r,x);
if(m<r) addd(u*2+1,m+1,R,l,r,x);
pushup(u);
}
}
int main(){
scanf("%d %d",&n,&m);
build(1,1,n);
int a,b,c;
double d=0;
while(m--){
scanf("%d",&a);
if(a == 1){
scanf("%d %d",&b,&c);
cin>>d;
addd(1,1,n,b,c,d);
}
if(a==2){
scanf("%d %d",&b,&c);
printf("%.4lf\n",get(1,1,n,b,c)*1.0/(c-b+1.0));
}
if(a==3){
scanf("%d %d",&b,&c);
dd sum1=get_b(1,1,n,b,c)*1.0/(c-b+1.0),sum2=get(1,1,n,b,c)*1.0/(c-b+1.0);
dd afjkf = sum1-sum2*sum2;
printf("%.4lf\n",afjkf);
}
}
return 0;
}