#include<bits/stdc++.h>
#define u(x) (((x)-1)/block+1)
#define len(x) (((x) == block+1) ? (n%block) : (block))
#define sqr(x) ((x)*(x))
#define N 100005
using namespace std;
int i, j, m, n, op, l, r, q, block;
double v, a[N], s[N], sq[N], t[N];
double sum(int l, int r)
{
double ans=0.0000;
if (u(l) == u(r))
{
for (i=l; i<=r; i++) ans += a[i] + t[u(i)];
return ans/(r-l+1);
}
for (i=l; u(i)==u(l); i++) ans += a[i] + t[u(i)];
for (i=r; u(i)==u(r); i--) ans += a[i] + t[u(i)];
for (i=u(l)+1; i<u(r); i++) ans += s[i] + t[i]*len(i);
return ans/(r-l+1);
}
double sqsum(int l, int r)
{
double ans=0.0000, as=0.0000;
if (u(l) == u(r))
{
for (i=l; i<=r; i++) ans += sqr(a[i] + t[u(i)]);
for (i=l; i<=r; i++) as += a[i] + t[u(i)];
return ans/(r-l+1)-sqr(as/(r-l+1));
}
for (i=l; u(i)==u(l); i++) ans += sqr(a[i] + t[u(i)]);
for (i=l; u(i)==u(l); i++) as += a[i] + t[u(i)];
for (i=r; u(i)==u(r); i--) ans += sqr(a[i] + t[u(i)]);
for (i=r; u(i)==u(r); i--) as += a[i] + t[u(i)];
for (i=u(l)+1; i<u(r); i++) ans += sq[i] + 2*t[i]*s[i] + len(i)*sqr(t[i]);
for (i=u(l)+1; i<u(r); i++) as += s[i] + t[i]*len(i);
return ans/(r-l+1)-sqr(as/(r-l+1));
}
void add(int l, int r, double v)
{
if (u(l) == u(r))
{
for (i=l; i<=r; i++)
{
sq[u(i)] += 2*v*a[i] + sqr(v);
a[i] += v;
s[u(i)] += v;
}
return;
}
for (i=l; u(i)==u(l); i++)
{
sq[u(i)] += 2*v*a[i] + sqr(v);
a[i] += v;
s[u(i)] += v;
}
for (i=r; u(i)==u(r); i--)
{
sq[u(i)] += 2*v*a[i] + sqr(v);
a[i] += v;
s[u(i)] += v;
}
for (i=u(l)+1; i<u(r); i++) t[i] += v;
}
int main()
{
scanf("%d %d", &n, &q);
for (i=1; i<=n; i++) scanf("%lf", &a[i]);
block = sqrt(n);
for (i=1; i<=n; i++)
{
s[u(i)] += a[i];
sq[u(i)] += sqr(a[i]);
}
while (q--)
{
scanf("%d %d %d", &op, &l, &r);
if (op == 1)
{
scanf("%lf", &v);
add(l, r, v);
}
else if (op == 2) printf("%.4lf\n", sum(l, r));
else printf("%.4lf\n", sqsum(l, r));
}
}