1 #include <cstdio>
2 #define ll long long
3 using namespace std;
4 struct edge { ll k,l,r; }tree[10000010];
5 ll n,Q,t,a,b,c,ans1,ans2;
6 double ans;
7 void down(ll d,ll l,ll r)
8 {
9 ll mid=l+r>>1;
10 tree[d*2].k+=tree[d].r*tree[d].r*(mid-l+1)+tree[d*2].l*2*tree[d].r,tree[d*2+1].k+=tree[d].r*tree[d].r*(r-mid)+tree[d*2+1].l*2*tree[d].r;
11 tree[d*2].l+=(mid-l+1)*tree[d].r,tree[d*2+1].l+=(r-mid)*tree[d].r,tree[d*2].r+=tree[d].r,tree[d*2+1].r+=tree[d].r,tree[d].r=0;
12 }
13 void insert(ll d,ll l,ll r,ll L,ll R,ll w)
14 {
15 if (l==L&&r==R) tree[d].k+=(R-L+1)*w*w+2*tree[d].l*w,tree[d].l+=w*(R-L+1),tree[d].r+=w;
16 else
17 {
18 ll mid=l+r>>1;down(d,l,r);
19 if (mid<L) insert(d*2+1,mid+1,r,L,R,w); else if (mid>=R) insert(d*2,l,mid,L,R,w);
20 else insert(d*2,l,mid,L,mid,w),insert(d*2+1,mid+1,r,mid+1,R,w);
21 tree[d].k=tree[d*2].k+tree[d*2+1].k,tree[d].l=tree[d*2].l+tree[d*2+1].l;
22 }
23 }
24 void Query(ll d,ll l,ll r,ll L,ll R)
25 {
26 if (l==L&&r==R) ans1+=tree[d].l,ans2+=tree[d].k;
27 else
28 {
29 ll mid=l+r>>1;down(d,l,r);
30 if (mid<L) Query(d*2+1,mid+1,r,L,R); else if (mid>=R) Query(d*2,l,mid,L,R);
31 else Query(d*2,l,mid,L,mid),Query(d*2+1,mid+1,r,mid+1,R);
32 tree[d].l=tree[d*2].l+tree[d*2+1].l,tree[d].k=tree[d*2].k+tree[d*2+1].k;
33 }
34 }
35 int main()
36 {
37 scanf("%lld%lld",&n,&Q);
38 for (ll i=1,x;i<=n;i++) scanf("%lld",&x),insert(1,1,n,i,i,x);
39 while (Q--)
40 {
41 scanf("%lld",&t),ans1=ans2=0;
42 if (t==0) scanf("%lld%lld",&a,&b),insert(1,1,n,a,a,b);
43 if (t==1) scanf("%lld%lld%lld",&a,&b,&c),insert(1,1,n,a,b,c);
44 if (t==2) scanf("%lld%lld",&a,&b),Query(1,1,n,a,b),printf("%lld\n",ans1);
45 if (t==3)
46 {
47 scanf("%lld%lld",&a,&b);
48 Query(1,1,n,a,b);
49 double x=ans1,y=ans2,z=(b-a+1);
50 ans=(double)((double)y*z-(double)x*x)/((double)z*z);
51 printf("%.4lf\n",ans);
52 }
53 }
54 }