class Node { Node left; Node right; int add; boolean v; } class SegmentTree { private Node root = new Node(); public SegmentTree() { } public void modify(int left, int right, int v) { modify(left, right, v, 1, (int) 1e9, root); } public void modify(int left, int right, int v, int l, int r, Node node) { if (l >= left && r <= right) { node.v = v == 1; node.add = v; return; } pushdown(node); int mid = (l + r) >> 1; if (left <= mid) { modify(left, right, v, l, mid, node.left); } if (right > mid) { modify(left, right, v, mid + 1, r, node.right); } pushup(node); } public boolean query(int left, int right) { return query(left, right, 1, (int) 1e9, root); } public boolean query(int left, int right, int l, int r, Node node) { if (l >= left && r <= right) { return node.v; } pushdown(node); int mid = (l + r) >> 1; boolean v = true; if (left <= mid) { v = v && query(left, right, l, mid, node.left); } if (right > mid) { v = v && query(left, right, mid + 1, r, node.right); } return v; } public void pushup(Node node) { node.v = node.left != null && node.left.v && node.right != null && node.right.v; } public void pushdown(Node node) { if (node.left == null) { node.left = new Node(); } if (node.right == null) { node.right = new Node(); } if (node.add != 0) { node.left.add = node.add; node.right.add = node.add; node.left.v = node.add == 1; node.right.v = node.add == 1; node.add = 0; } } } class RangeModule { private SegmentTree tree = new SegmentTree(); public RangeModule() { } public void addRange(int left, int right) { tree.modify(left, right - 1, 1); } public boolean queryRange(int left, int right) { return tree.query(left, right - 1); } public void removeRange(int left, int right) { tree.modify(left, right - 1, -1); } } /** * Your RangeModule object will be instantiated and called as such: * RangeModule obj = new RangeModule(); * obj.addRange(left,right); * boolean param_2 = obj.queryRange(left,right); * obj.removeRange(left,right); */