| 12
 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
 
 | class MyCalendar {
 public MyCalendar() {
 
 }
 
 public boolean book(int start, int end) {
 
 if (query(root, 0, N, start, end - 1) != 0) return false;
 
 update(root, 0, N, start, end - 1, 1);
 return true;
 }
 
 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;
 }
 
 private static class Node {
 
 Node left, right;
 
 int val, add;
 }
 }
 
 
 
 
 
 
 
 |