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
| class MyCalendarThree {
public MyCalendarThree() {
} public int book(int start, int end) { update(root, 0, N, start, end - 1, 1); return root.val; }
private static class Node { Node left, right; int val, add; } private int N = (int) 1e9; private Node root = new Node();
public void update(Node node, int start, int end, int l, int r, int val) { if (l <= start && end <= r) { node.val += val; node.add += val; return; } pushDown(node); int mid = (start + end) >> 1; if (l <= mid) update(node.left, start, mid, l, r, val); if (r > mid) update(node.right, mid + 1, end, l, r, val); pushUp(node); } public int query(Node node, int start, int end, int l, int r) { if (l <= start && end <= r) return node.val; pushDown(node); int mid = (start + end) >> 1, ans = 0; if (l <= mid) ans = query(node.left, start, mid, l, r); if (r > mid) ans = Math.max(ans, query(node.right, mid + 1, end, l, r)); return ans; } private void pushUp(Node node) { node.val = Math.max(node.left.val, node.right.val); } private void pushDown(Node node) { if (node.left == null) node.left = new Node(); if (node.right == null) node.right = new Node(); if (node.add == 0) return ; node.left.val += node.add; node.right.val += node.add; node.left.add += node.add; node.right.add += node.add; node.add = 0; } }
|