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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| class Solution { public long[] handleQuery(int[] nums1, int[] nums2, int[][] queries) { SegTree segTree1 = new SegTree(nums1); long sum = Arrays.stream(nums2).mapToLong(Long::valueOf).sum(); List<Long> ans = new ArrayList<>(); for (int[] item : queries) { if(item[0] == 1){ segTree1.update(item[1], item[2], 1, 0, nums1.length - 1, 1); } if (item[0] == 2) { sum += segTree1.query(0, nums1.length - 1, 0, nums1.length - 1, 1) * (long)item[1]; } if (item[0] == 3) { ans.add(sum); } } return ans.stream().mapToLong(a -> a).toArray(); } }
class SegTree { long[] arr; int[] lazyTag; int[] org;
public SegTree(int[] org) { this.org = org; this.arr = new long[org.length * 4]; this.lazyTag = new int[org.length * 4]; build(0, org.length - 1, 1); }
private void build(int s, int t, int p) { if (s == t) { arr[p] = org[s]; return; } int mid = s + (t - s >> 1); build(s, mid, p * 2); build(mid + 1, t, p * 2 + 1); arr[p] = arr[p * 2] + arr[p * 2 + 1]; }
public void update(int l, int r, int c, int s, int t, int p){ if (l <= s && r >= t) { arr[p] = (t - s + 1) - arr[p]; lazyTag[p] += c; return; } int mid = s + (t - s >> 1); if (lazyTag[p] != 0) { if (lazyTag[p] % 2 != 0) { arr[p * 2] = (mid - s + 1) - arr[p * 2]; } if (lazyTag[p] % 2 != 0){ arr[p * 2 + 1] = (t - mid) - arr[p * 2 + 1]; } lazyTag[p * 2] += lazyTag[p]; lazyTag[p * 2 + 1] += lazyTag[p]; lazyTag[p] = 0; } if (l <= mid) { update(l, r, c, s, mid, p * 2); } if (r >= mid + 1) { update(l, r, c, mid + 1, t, p * 2 + 1); } arr[p] = arr[p * 2] + arr[p * 2 + 1]; }
public long query(int l, int r, int s, int t, int p){ if (l <= s && r >= t) { return arr[p]; } int mid = s + (t - s >> 1); if (lazyTag[p] != 0) { if (lazyTag[p] % 2 != 0) { arr[p * 2] = (mid - s + 1) - arr[p * 2]; } if (lazyTag[p] % 2 != 0){ arr[p * 2 + 1] = (t - mid) - arr[p * 2 + 1]; } lazyTag[p * 2] += lazyTag[p]; lazyTag[p * 2 + 1] += lazyTag[p]; lazyTag[p] = 0; } int sum = 0; if (l <= mid) { sum += query(l, r, s, mid, p * 2); } if (r >= mid + 1) { sum += query(l, r, mid + 1, t, p * 2 + 1); } return sum; }
}
|