#include<bits/stdc++.h>
using namespace std;
#define N 100002
int n,m;
double mk[N*4];
struct node{double sum,square;}s[N*4];
void build(int a,int b,int d){
if(a==b){
cin>>s[d].sum;
s[d].square=s[d].sum*s[d].sum;return;}
build(a,a+(b-a)/2,d*2);
build(a+(b-a)/2+1,b,d*2+1);
s[d].sum=s[d*2].sum+s[d*2+1].sum;
s[d].square=s[d*2].square+s[d*2+1].square;
}
void redact(int x,int y,double k,int d,int l,int r){
if(y<l||x>r)return;
if(l>=x&&r<=y){
s[d].square+=(r-l+1)*k*k+2*k*s[d].sum;
s[d].sum+=k*(r-l+1);
if(l<r)mk[d]+=k;
return;}
redact(x,y,k,d*2,l,l+(r-l)/2);
redact(x,y,k,d*2+1,l+(r-l)/2+1,r);
s[d].sum=s[d*2].sum+s[d*2+1].sum;
s[d].square=s[d*2].square+s[d*2+1].square;
}
void gu(int d,double k,int l,int r){
s[d].square+=(r-l+1)*k*k+2*k*s[d].sum;
s[d].sum+=k*(r-l+1);
if(l<r)mk[d]+=k;
}
double find1(int x,int y,int d,int l,int r){
if(mk[d]!=0){
gu(d*2,mk[d],l,l+(r-l)/2);
gu(d*2+1,mk[d],l+(r-l)/2+1,r);
mk[d]=0;}
if(y<l||x>r)return 0;
if(l>=x&&r<=y)return s[d].sum;
return find1(x,y,d*2,l,l+(r-l)/2)+find1(x,y,d*2+1,l+(r-l)/2+1,r);
}
double find2(int x,int y,int d,int l,int r){
if(mk[d]!=0){
gu(d*2,mk[d],l,l+(r-l)/2);
gu(d*2+1,mk[d],l+(r-l)/2+1,r);
mk[d]=0;}
if(y<l||x>r)return 0;
if(l>=x&&r<=y)return s[d].square;
return find2(x,y,d*2,l,l+(r-l)/2)+find2(x,y,d*2+1,l+(r-l)/2+1,r);
}
int main(){
cin>>n>>m;
build(1,n,1);
while(m--){
int o;cin>>o;
if(o==1){
int x,y;double k;cin>>x>>y;cin>>k;
redact(x,y,k,1,1,n);
}else if(o==2){
int x,y;cin>>x>>y;
double v=find1(x,y,1,1,n)/(y-x+1);
printf("%.4f\n",v);
}else{
int x,y;cin>>x>>y;
double v=find1(x,y,1,1,n)/(y-x+1),v2=find2(x,y,1,1,n)/(y-x+1);
printf("%.4f\n",v2-v*v);
}
}
return 0;
}