Advertisement
SoggyCrunch

Untitled

Apr 2nd, 2022
1,206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.88 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class SegTreeImp{
  5.     public static int[] segTreeArr;
  6.     public static int n;
  7.     public static void main (String[] args)throws IOException{
  8.         Scanner in = new Scanner (new FileReader("input"));
  9.         n = in.nextInt();
  10.         int q = in.nextInt();
  11.         int[] arr = new int[n];
  12.         for (int i = 0; i < n; i++){
  13.             arr[i] = in.nextInt();
  14.         }
  15.         segTreeArr = new int[nextPowerTwo(n)];
  16.         //System.out.println('\n'+nextPowerTwo(n));
  17.         for (int i = 0; i < arr.length; i++){
  18.             segTreeArr[n+i] = arr[i];
  19.         }
  20.        
  21.         for (int i = n-1; i >= 1; i--){
  22.             segTreeArr[i] = segTreeArr[i*2]+segTreeArr[i*2+1];
  23.         }
  24.         System.out.println(Arrays.toString(segTreeArr));
  25.         System.out.println(intervalSum(1, 0, 1, 0, 7));
  26.        
  27.     }
  28.  
  29.     public static void pointUpdate(int updateIndex, int updatePlus){
  30.         updateIndex += n;
  31.         segTreeArr[updateIndex] += updatePlus;
  32.         updateIndex/=2;
  33.         while (updateIndex >= 1){
  34.             segTreeArr[updateIndex] = segTreeArr[updateIndex*2]+segTreeArr[updateIndex*2+1];
  35.             updateIndex /= 2;
  36.         }
  37.     }
  38.  
  39.     public static int intervalSum(int node, int queryStart, int queryEnd, int nodeStart, int nodeEnd){
  40.         if (queryStart <= nodeStart && nodeEnd <= queryEnd){//current interval is fully within query interval
  41.             return segTreeArr[node];
  42.         }
  43.  
  44.         if (queryEnd < nodeStart || queryStart > nodeEnd){//current interval is disjoint
  45.             return 0;
  46.         }
  47.  
  48.         return (intervalSum(node*2, queryStart, queryEnd, nodeStart, nodeEnd/2))
  49.                 + intervalSum(node*2+1, queryStart, queryEnd, nodeEnd/2+1, nodeEnd);
  50.  
  51.     }
  52.     static int nextPowerTwo(int n){
  53.         n++;
  54.         int count = 0;
  55.  
  56.         // First n in the below
  57.         // condition is for the
  58.         // case where n is 0
  59.         if (n > 0 && (n & (n - 1)) == 0)
  60.             return n;
  61.  
  62.         while(n != 0)
  63.         {
  64.             n >>= 1;
  65.             count += 1;
  66.         }
  67.  
  68.         return 1 << count;
  69.     }
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement