#include<bits/stdc++.h>
using namespace std;
int n,m;
double a[101000];
struct node{
int l,r;
double dat,pow_dat,add,pow_;
}tree[401000];
void build(int p,int l,int r){
tree[p].l=l,tree[p].r=r;
if(l==r){
tree[p].dat=a[l];
tree[p].pow_dat=a[l]*a[l];
return ;
}
int mid=(tree[p].l+tree[p].r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
tree[p].dat=tree[p*2].dat+tree[p*2+1].dat;
tree[p].pow_dat=tree[p*2].pow_dat+tree[p*2+1].pow_dat;
}
void down(int p){
int k=tree[p].pow_;
tree[p*2].pow_dat+=2*tree[p*2].dat*k+k*(tree[p*2].r-tree[p*2].l+1);
tree[p*2+1].pow_dat+=2*tree[p*2+1].dat*k+k*(tree[p*2+1].r-tree[p*2+1].l+1);
tree[p*2].pow_+=k;
tree[p*2+1].pow_+=k;
tree[p].pow_=0;
k=tree[p].add;
tree[p*2].dat+=k*(tree[p*2].r-tree[p*2].l+1);
tree[p*2+1].dat+=k*(tree[p*2+1].r-tree[p*2+1].l+1);
tree[p*2].add+=k;
tree[p*2+1].add+=k;
tree[p].add=0;
}
void update(int p,int l,int r,double k){
if(tree[p].l>=l&&tree[p].r<=r){
tree[p].pow_dat+=2*tree[p].dat*k+k*(tree[p].r-tree[p].l+1);
tree[p].dat+=k*(tree[p].r-tree[p].l+1);
tree[p].pow_+=k;
tree[p].dat+=k;
return ;
}
down(p);
int mid=(tree[p].l+tree[p].r)/2;
if(l<=mid)
update(p*2,l,r,k);
if(r>mid)
update(p*2+1,l,r,k);
tree[p].dat=tree[p*2].dat+tree[p*2+1].dat;
tree[p].pow_dat=tree[p*2].pow_dat+tree[p*2+1].pow_dat;
}
double add_ask(int p,int l,int r){
if(tree[p].l>=l&&tree[p].r<=r)
return tree[p].dat;
down(p);
double ans=0;
int mid=(tree[p].l+tree[p].r)/2;
if(l<=mid)
ans+=add_ask(p*2,l,r);
if(r>mid)
ans+=add_ask(p*2+1,l,r);
return ans;
}
double pow_ask(int p,int l,int r){
if(tree[p].l>=l&&tree[p].r<=r)
return tree[p].pow_dat;
down(p);
double ans=0;
int mid=(tree[p].l+tree[p].r)/2;
if(l<=mid)
ans+=pow_ask(p*2,l,r);
if(r>mid)
ans+=pow_ask(p*2+1,l,r);
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lf",&a[i]);
build(1,1,n);
while(m--){
int op,x,y;
double k;
scanf("%d",&op);
if(op==1){
scanf("%d%d%lf",&x,&y,&k);
update(1,x,y,k);
}
if(op==2){
scanf("%d%d",&x,&y);
double sum=add_ask(1,x,y);
int len=y-x+1;
double ans=sum/len;
printf("%.4lf\n",ans);
}
if(op==3){
scanf("%d%d",&x,&y);
double sum=add_ask(1,x,y);
double pow_sum=pow_ask(1,x,y);
int len=y-x+1;
double ans=(len*(sum/len)*(sum/len)+pow_sum-2*(sum/len)*sum)/len;
printf("%.4lf\n",ans);
}
}
return 0;
}