1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| static class SegTree { int[] nums; long[] sum;
int[] flip;
SegTree(int[] _nums) { this.nums = _nums; int n = nums.length; sum = new long[n * 4]; flip = new int[n * 4]; }
void pushDown(int o, int l, int r) { if (flip[o] != 0) { int mid = (l + r) / 2; sum[o * 2] += (long) flip[o] * (mid - l + 1); flip[o * 2] += flip[o]; sum[o * 2 + 1] += (long) flip[o] * (r - mid); flip[o * 2 + 1] += flip[o]; flip[o] = 0; } }
void pushUp(int o) { sum[o] = sum[o * 2] + sum[o * 2 + 1]; }
void build(int o, int l, int r) { if (l == r) { sum[o] = nums[l - 1]; return; } int mid = (l + r) / 2; build(o * 2, l, mid); build(o * 2 + 1, mid + 1, r); pushUp(o); }
void upDate(int o, int l, int r, int p, int v) { if (l == p && r == p) { sum[o] += v; return; } int mid = (l + r) / 2; if (mid >= p) upDate(o * 2, l, mid, p, v); else upDate(o * 2 + 1, mid + 1, r, p, v); pushUp(o); }
void upDate(int o, int l, int r, int L, int R, int v) { if (l >= L && r <= R) { sum[o] += (long) (r - l + 1) * v; flip[o] += v; return; } pushDown(o, l, r); int mid = (l + r) / 2; if (mid >= L) upDate(o * 2, l, mid, L, R, v); if (mid < R) upDate(o * 2 + 1, mid + 1, r, L, R, v); pushUp(o); }
long query(int o, int l, int r, int L, int R) { if (l >= L && r <= R) { return sum[o]; } pushDown(o, l, r); long ans = 0; int mid = (l + r) / 2; if (mid >= L) ans += query(o * 2, l, mid, L, R); if (mid < R) ans += query(o * 2 + 1, mid + 1, r, L, R); return ans; }
}
|