CCCPaste

d8b75b9989312

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