segment trees are op


segment trees are lowkey cool

I first learnt about segment trees in my Adavanced data structures class since then they have came useful in several leetcode problems and overall i find the idea quite appealing

i think segment trees is just like prefix sums but 2 dimensional or smthn

anyways here is the code for the goats



class SegmentTree {
   int n; 
   int[] tree;
   SegmentTree(int[] nums){
       n = nums.length;
       tree = new int[4*n];
       build(nums,0,0,n-1);
   }

   public int build(int[] nums , int node , int start , int end ){
       if(start == end ){
           tree[node]=nums[start];
           return tree[node];
       }
       int mid = start + (end-start)/2;
       int left = build(nums,node*2+1,start,mid);
       int right = build(nums,node*2+2,mid+1,end);
       tree[node]= left + right;
       return tree[node];
   }

   public int query(int node , int start ,int end , int qstart , int qend ){
       if(qstart> end || qend < start ) return 0;
       if ( start >= qstart && end <=qend ) return tree[node];
       int mid = start + (end-start)/2;
       int leftHalf = query(node*2+1,start,mid,qstart , qend);
       int rightHalf = query(node*2+2,mid+1,end,qstart,qend);
       return leftHalf+ rightHalf;
   }

   public int query( int left , int right){
       return query(0,0,n-1,left ,right );
   }
   
   public int update(int node , int start , int end ,int index, int val){
       if(start == end ) {
           tree[node]= val;
           return tree[node];
       }
       int mid = start+(end - start)/2;
       if(index<=mid){
       update(node*2+1,start, mid , index,val);
       }else{
       update(node*2+2 , mid+1, end , index, val);
       }
       tree[node] = tree[node*2+1]+tree[node*2+2];
       return tree[node];
   }

   public void update(int index,int val){
        update(0,0,n-1,index,val);
   }
}