#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn], sum[maxn << 2], tag[maxn << 2];
int ls(int rt) {
return rt << 1;
}
int rs(int rt) {
return rt << 1 | 1;
}
void Push_up(int rt) {
sum[rt] = sum[ls(rt)] + sum[rs(rt)];
}
void Add(int rt, int l, int r, int d) {
sum[rt] += d * (r - l + 1);
tag[rt] += d;
}
void Push_down(int rt, int l, int r) {
if (tag[rt]) {
int mid = (l + r) >> 1;
Add(ls(rt), l, mid, tag[rt]);
Add(rs(rt), mid + 1, r, tag[rt]);
tag[rt] = 0;
}
}
void Build(int rt, int l, int r) {
tag[rt] = 0;
if (l == r) {
sum[rt] = a[l];
return;
}
int mid = (l + r) >> 1;
Build(ls(rt), l, mid);
Build(rs(rt), mid + 1, r);
Push_up(rt);
}
void Modify(int rt, int l, int r, int L, int R, int d) {
if (L <= l && r <= R) {
Add(rt, l, r, d);
return;
}
Push_down(rt, l, r);
int mid = (l + r) >> 1;
if (L <= mid) {
Modify(ls(rt), l, mid, L, R, d);
}
if (R > mid) {
Modify(rs(rt), mid + 1, r, L, R, d);
}
Push_up(rt);
}
double Ask1(int rt, int l, int r, int L, int R) {
if (L <= l && r <= R) {
return sum[rt];
}
Push_down(rt, l, r);
int mid = (l + r) >> 1;
double res = 0;
if (L <= mid) {
res += Ask1(ls(rt), l, mid, L, R);
}
if (R > mid) {
res += Ask1(rs(rt), mid + 1, r, L, R);
}
return res;
}
int Ask2(int rt,int l,int r,int pos) {
if (l==r) {
return sum[rt];
}
Push_down(rt, l, r);
int mid = (l + r) >> 1;
if (pos <= mid) {
return Ask2(ls(rt), l, mid,pos);
} else {
return Ask2(rs(rt), mid + 1, r,pos);
}
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1; i<=n; ++i) {
scanf("%d",&a[i]);
}
Build(1,1,n);
while(m--) {
int op,x,y,k;
scanf("%d%d%d",&op,&x,&y);
if(op==1) {
scanf("%d",&k);
Modify(1,1,n,x,y,k);
} else if(op==2) {
printf("%.4f\n",Ask1(1,1,n,x,y)/(y-x+1));
} else {
int ans[maxn];
int d = 1;
for(int i = x; i<=y; ++i) {
ans[d] = Ask2(1,1,n,i);
d++;
}
int res = Ask1(1,1,n,x,y)/(y-x+1);
double num = 0;
for(int i = 1; i<=(y-1+1); ++i) {
num += (res-ans[i])*(res-ans[i]);
}
printf("%.4f\n",num/(y-x+1));
}
}
return 0;
}