1function apply(node, l, r, val) {
2 tree[node] += val * (r - l + 1); lazy[node] += val;
3}
4function pushDown(node, l, r) {
5 if (lazy[node] === 0) return;
6 const m = (l + r) >> 1;
7 apply(node*2+1, l, m, lazy[node]);
8 apply(node*2+2, m+1, r, lazy[node]);
9 lazy[node] = 0;
10}
11function update(node, l, r, qL, qR, val) {
12 if (qL <= l && r <= qR) { apply(node, l, r, val); return; }
13 pushDown(node, l, r);
14 const m = (l + r) >> 1;
15 if (qL <= m) update(node*2+1, l, m, qL, qR, val);
16 if (qR > m) update(node*2+2, m+1, r, qL, qR, val);
17 tree[node] = tree[node*2+1] + tree[node*2+2];
18}
19function query(node, l, r, qL, qR) {
20 if (qL <= l && r <= qR) return tree[node];
21 pushDown(node, l, r);
22 const m = (l + r) >> 1; let res = 0;
23 if (qL <= m) res += query(node*2+1, l, m, qL, qR);
24 if (qR > m) res += query(node*2+2, m+1, r, qL, qR);
25 return res;
26}