Advertisement
thewitchking

Untitled

Dec 14th, 2023
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.79 KB | None | 0 0
  1. class RangeModule {
  2.    
  3.     public  static class  Node{
  4.         public int left;
  5.         public int right;
  6.  
  7.         public Node l;
  8.         public Node r;
  9.         public Node(int left,int right){
  10.             this.left=left;
  11.             this.right=right;
  12.         }
  13.     }
  14.     public Node root;
  15.     public RangeModule() {
  16.  
  17.     }
  18.    
  19.     public void addRange(int left, int right) {
  20.         this.root=insert(root,left,right-1);
  21.     }
  22.    
  23.     public boolean queryRange(int left, int right) {
  24.         return query(root,left,right-1);
  25.     }
  26.    
  27.     public void removeRange(int left, int right) {
  28.         this.root=remove(root,left,right-1);
  29.     }
  30.    
  31.     public Node remove(Node node,int left,int right){
  32.         if(node==null)
  33.             return null;
  34.        
  35.         if(right<node.left){
  36.             node.l=remove(node.l,left,right);
  37.         }else if(left>node.right){
  38.        
  39.             node.r=remove(node.r,left,right);
  40.         }else if(left<=node.left && right>=node.right){
  41.        
  42.             Node l=remove(node.l,left,right);
  43.             Node r=remove(node.r,left,right);
  44.             if(l==null){
  45.                 return r;
  46.             }else if(r==null){
  47.                 return l;
  48.             }else{
  49.                 if(l.r==null){
  50.                     l.r=r;
  51.                     return l;
  52.                 }else{
  53.                     Node temp=r;
  54.                     while(temp.l!=null){
  55.                         temp=temp.l;
  56.                     }
  57.                     temp.l=l;
  58.                     return r;
  59.                 }
  60.             }
  61.  
  62.         }else if(left<=node.left){
  63.             node.left=right+1;
  64.             node.l=remove(node.l,left,right);
  65.  
  66.         }else if(right>=node.right){
  67.        
  68.             node.right=left-1;
  69.             node.r=remove(node.r,left,right);
  70.  
  71.         }else{
  72.  
  73.             Node newR=new Node(right+1,node.right);
  74.             Node r=node.r;
  75.             node.right=left-1;
  76.             newR.r=r;
  77.             node.r=newR;
  78.         }
  79.  
  80.         return node;
  81.     }
  82.     public boolean query(Node node,int left,int right){
  83.        
  84.         if(node==null)
  85.             return false;
  86.  
  87.         if(right<node.left){
  88.             return query(node.l,left,right);
  89.         }else if(left>node.right){
  90.             return query(node.r,left,right);
  91.         }else if(left>=node.left && right<=node.right){
  92.             return true;
  93.         }
  94.         return false;
  95.     }
  96.    
  97.     public Node insert(Node node,int left,int right){
  98.         if(node==null){
  99.             return new Node(left,right);
  100.         }
  101.         if(right<node.left -1){
  102.             node.l=insert(node.l,left,right);
  103.  
  104.         } else if(left >node.right+1){
  105.             node.r=insert(node.r,left,right);
  106.  
  107.         }else{
  108.             int[]info=new int[]{left,right};
  109.             node.l=insertprocess(node.l,info,true);
  110.             node.r=insertprocess(node.r,info,false);
  111.          node.left=Math.min(node.left,info[0]);       node.right=Math.max(node.right,info[1]);
  112.         }
  113.         return node;
  114.     }
  115.     public Node insertprocess(Node node,int [] info,boolean isleft){
  116.         if(node==null){
  117.             return null;
  118.         }
  119.         if(isleft){
  120.        
  121.             if(node.right>=info[0]-1){
  122.                 info[0]=Math.min(info[0],node.left);
  123.                 return insertprocess(node.l,info,isleft);
  124.             }else{
  125.                 node.r=insertprocess(node.r,info,isleft);
  126.                 return node;
  127.             }
  128.         }else if(!isleft){
  129.             if(node.left <=info[1]+1){
  130.                 info[1]=Math.max(info[1],node.right);
  131.                 return insertprocess(node.r,info,isleft);
  132.             }else{
  133.                 node.l=insertprocess(node.l,info,isleft);
  134.                 return node;
  135.             }
  136.         }
  137.         return node;
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement