#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 33;
#define mid ((l + r) >> 1)
#define lx(x) (x << 1)
#define rx(x) (x << 1 | 1)
int n, m;
double t[N << 2], a[N], w[N << 2], w1[N << 2];
void push_up(int u){
w[u] = w[lx(u)] + w[rx(u)];
w1[u] = w1[lx(u)] + w1[rx(u)];
}
int build(int u, int l, int r){
if(l == r)return w[u] = a[l], w1[u] = a[l] * a[l];
build(lx(u), l, mid); build(rx(u), mid + 1, r);
push_up(u);
return 0;
}
void addt(int u, int l, int r, int k){
w1[u] += w[u] * 2 * k + (r - l + 1) * k * k;
t[u] += k;
w[u] += (r - l + 1) * k;
}
void push_down(int u, int l, int r){
if(!t[u])return ;
addt(lx(u), l, mid, t[u]); addt(rx(u), mid + 1, r, t[u]);
t[u] = 0;
}
void add(int u, int l, int r, int L, int R, double k){
if(l > R || r < L)return ;
if(l >= L && r <= R)return addt(u, l, r, k);
push_down(u, l ,r);
add(lx(u), l, mid, L, R, k);add(rx(u), mid + 1, r, L, R, k);
push_up(u);
}
double ask(int u, int l, int r, int L, int R){
if(l > R || r < L)return 0;
if(l >= L && r <= R)return w[u];
push_down(u, l ,r);
return ask(lx(u), l, mid, L, R) + ask(rx(u), mid + 1, r, L, R);
}
double ask1(int u, int l, int r, int L, int R){
if(l > R || r < L) return 0;
if(l >= L && r <= R) return w1[u];
push_down(u, l, r);
return (ask1(lx(u), l, mid, L, R) + ask1(rx(u), mid + 1, r, L, R)) / (r - l + 1);
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++)cin >> a[i];
build(1, 1, n);
for(int i = 1; i <= m; i++){
int op, x, y;
double k;
cin >> op >> x >> y;
if(op == 1){
cin >> k;
add(1, 1, n, x, y, k);
}
if(op == 2){
printf("%.4f\n", (ask(1, 1, n, x, y)) / (y - x + 1));
}
if(op == 3){
double sum1 = ask1(1, 1, n, x, y) / (y - x + 1), sum2 = ask(1, 1, n, x, y) / (y - x + 1);
double ans = sum1 - sum2 * sum2;
printf("%.4f\n", ans);
}
}
return 0;
}