Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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(right<node.left){
- node.l=remove(node.l,left,right);
- }else if(left>node.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(right<node.left){
- return query(node.l,left,right);
- }else if(left>node.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(right<node.left -1){
- node.l=insert(node.l,left,right);
- } else if(left >node.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;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement