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;
}
}