#include <bits/stdc++.h>
#define ls k << 1
#define rs k << 1 | 1
#define reg register
using namespace std;
template <typename T> inline T read() {
T x = 0; bool flag = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') flag = 0; c = getchar(); }
x = c - '0'; c = getchar();
while (isdigit(c)) {x = (x << 3) + (x << 1) + c - '0'; c = getchar(); }
if (flag) return x;
return ~(x - 1);
}
const int N = 1e5 + 5;
struct Tree {
double sum, mul, lazy;
}T[N << 2];
double a[N];
void pushup(int k) {
T[k].sum = T[ls].sum + T[rs].sum;
T[k].mul = T[ls].mul + T[rs].mul;
}
void Build(int k, int l, int r) {
if (l == r) {
T[k].sum = a[l];
T[k].mul = a[l] * a[l];
return ;
}
int mid = (l + r) >> 1;
Build(ls, l, mid);
Build(rs, mid + 1, r);
pushup(k);
return ;
}
void pushdown(int k, int l, int r, int mid) {
T[ls].lazy += T[k].lazy;
T[rs].lazy += T[k].lazy;
T[ls].mul += T[ls].sum * T[k].lazy * 2 + T[k].lazy * T[k].lazy * (mid - l + 1);
T[rs].mul += T[rs].sum * T[k].lazy * 2 + T[k].lazy * T[k].lazy * (r - mid);
T[ls].sum += T[k].lazy * (mid - l + 1);
T[rs].sum += T[k].lazy * (r - mid);
T[k].lazy = 0;
}
void Update(int k, int l, int r, int L, int R, double x) {
if (l >= L && r <= R) {
T[k].mul += T[k].sum * (x * 2) + (x * x) * (r - l + 1);
T[k].sum += (r - l + 1) * x;
T[k].lazy += x;
return ;
}
int mid = (l + r) >> 1;
if (T[k].lazy)
pushdown(k, l, r, mid);
if (L <= mid) Update(ls, l, mid, L, R, x);
if (R > mid) Update(rs, mid + 1, r, L ,R, x);
pushup(k);
return ;
}
double Query(int k, int l, int r, int L, int R) {
if (l >= L && r <= R)
return T[k].sum;
int mid = (l + r) >> 1;
double ans = 0;
if (T[k].lazy)
pushdown(k, l, r, mid);
if (L <= mid) ans += Query(ls, l, mid, L, R);
if (R > mid) ans += Query(rs, mid + 1, r, L, R);
return ans;
}
double Ask(int k, int l, int r, int L, int R) {
if (l >= L && r <= R)
return T[k].mul;
int mid = (l + r) >> 1;
double ans = 0;
if (T[k].lazy)
pushdown(k, l, r, mid);
if (L <= mid) ans += Ask(ls, l, mid, L, R);
if (R > mid) ans += Ask(rs, mid + 1, r, L, R);
return ans;
}
signed main() {
int n, q;
n = read<int>(), q = read<int>();
for (reg int i = 1; i <= n; ++i)
a[i] = read<int>();
Build(1, 1, n);
for (reg int i = 1; i <= q; ++i) {
int op, l, r, k, sum;
op = read<int>(), l = read<int>(), r = read<int>();
switch(op) {
case 1:
k = read<int>();
Update(1, 1, n, l, r, k);
break;
case 2:
printf("%.4lf\n", Query(1, 1, n, l, r) / 1.0 / (r - l + 1));
break;
case 3:
sum = Query(1, 1, n, l, r);
printf("%.4lf\n", Ask(1, 1, n, l, r) / 1.0 / (r - l + 1) - (sum / 1.0 / (r - l + 1)) * (sum / 1.0 / (r - l + 1)));
break;
}
}
return 0;
}
样例过了,测试点死活过不去
救救孩子吧,调了几天了