#include<bits/stdc++.h>
using namespace std;
int n,m;
double sum1[400010],sum2[400010],add[400010];
void push_up(int rt){
sum1[rt]=sum1[rt<<1]+sum1[rt<<1|1];
sum2[rt]=sum2[rt<<1]+sum2[rt<<1|1];
}
void build(int l,int r,int rt){
if(l==r){
scanf("%lf",&sum1[rt]);
sum2[rt]=sum1[rt];
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
push_up(rt);
}
void push_down(int rt,int m){
if(add[rt]){
add[rt<<1]+=add[rt];
add[rt<<1|1]+=add[rt];
sum2[rt<<1]+=add[rt]*add[rt]*(m-(m>>1))+2*add[rt]*sum1[rt];
sum1[rt<<1|1]+=add[rt]*(m-(m>>1));
sum2[rt<<1]+=add[rt]*add[rt]*(m>>1)+2*add[rt]*sum1[rt];
sum1[rt<<1|1]+=add[rt]*(m>>1);
add[rt]=0;
}
}
void update(int l,int r,int rt,int a,int b,double c){
if(a<=l&&b>=r){
add[rt]+=c;
sum2[rt]+=c*c*(r-l+1)+2*c*sum1[rt];
sum1[rt]+=(r-l+1)*c;
return;
}
push_down(rt,r-l+1);
int mid=(l+r)>>1;
if(a<=mid) update(l,mid,rt<<1,a,b,c);
if(b>mid) update(mid+1,r,rt<<1|1,a,b,c);
push_up(rt);
}
double query1(int l,int r,int rt,int a,int b){
if(a<=l&&b>=r) return sum1[rt];
push_down(rt,r-l+1);
int mid=(l+r)>>1;
double ans=0;
if(a<=mid) ans+=query1(l,mid,rt<<1,a,b);
if(b>mid) ans+=query1(mid+1,r,rt<<1|1,a,b);
return ans;
}
double query2(int l,int r,int rt,int a,int b){
if(a<=l&&b>=r) return sum2[rt];
push_down(rt,r-l+1);
int mid=(l+r)>>1;
double ans=0;
if(a<=mid) ans+=query2(l,mid,rt<<1,a,b);
if(b>mid) ans+=query2(mid+1,r,rt<<1|1,a,b);
return ans;
}
int main(){
scanf("%d%d",&n,&m);
build(1,n,1);
while(m--){
int op;
scanf("%d",&op);
if(op==1){
int x,y;
double k;
scanf("%d%d%lf",&x,&y,&k);
update(1,n,1,x,y,k);
}else if(op==2){
int x,y;
scanf("%d%d",&x,&y);
printf("%.4lf\n",query1(1,n,1,x,y)/(y-x+1));
}else{
int x,y;
scanf("%d%d",&x,&y);
double s=query1(1,n,1,x,y),p=(y-x+1);
printf("%.4lf\n",sqrt((query2(1,n,1,x,y)-2*s*p+p*p*(y-x+1))/(y-x+1)));
}
}
return 0;
}