class RangeModule { public static class Node{ public int left; public int right; public Node l; public Node r; public Node(int left,int right){ this.left=left; this.right=right; } } public Node root; public RangeModule() { } public void addRange(int left, int right) { this.root=insert(root,left,right-1); } public boolean queryRange(int left, int right) { return query(root,left,right-1); } public void removeRange(int left, int right) { this.root=remove(root,left,right-1); } public Node remove(Node node,int left,int right){ if(node==null) return null; if(rightnode.right){ node.r=remove(node.r,left,right); }else if(left<=node.left && right>=node.right){ Node l=remove(node.l,left,right); Node r=remove(node.r,left,right); if(l==null){ return r; }else if(r==null){ return l; }else{ if(l.r==null){ l.r=r; return l; }else{ Node temp=r; while(temp.l!=null){ temp=temp.l; } temp.l=l; return r; } } }else if(left<=node.left){ node.left=right+1; node.l=remove(node.l,left,right); }else if(right>=node.right){ node.right=left-1; node.r=remove(node.r,left,right); }else{ Node newR=new Node(right+1,node.right); Node r=node.r; node.right=left-1; newR.r=r; node.r=newR; } return node; } public boolean query(Node node,int left,int right){ if(node==null) return false; if(rightnode.right){ return query(node.r,left,right); }else if(left>=node.left && right<=node.right){ return true; } return false; } public Node insert(Node node,int left,int right){ if(node==null){ return new Node(left,right); } if(rightnode.right+1){ node.r=insert(node.r,left,right); }else{ int[]info=new int[]{left,right}; node.l=insertprocess(node.l,info,true); node.r=insertprocess(node.r,info,false); node.left=Math.min(node.left,info[0]); node.right=Math.max(node.right,info[1]); } return node; } public Node insertprocess(Node node,int [] info,boolean isleft){ if(node==null){ return null; } if(isleft){ if(node.right>=info[0]-1){ info[0]=Math.min(info[0],node.left); return insertprocess(node.l,info,isleft); }else{ node.r=insertprocess(node.r,info,isleft); return node; } }else if(!isleft){ if(node.left <=info[1]+1){ info[1]=Math.max(info[1],node.right); return insertprocess(node.r,info,isleft); }else{ node.l=insertprocess(node.l,info,isleft); return node; } } return node; } }