1
+ package DataStructures .Trees ;
2
+
3
+ public class SegmentTree {
4
+ private int seg_t [];
5
+ private int n ;
6
+ private int arr [];
7
+
8
+ /* Constructor which takes the size of the array and the array as a parameter*/
9
+ public SegmentTree (int n , int arr []) {
10
+ this .n = n ;
11
+ int x = (int ) (Math .ceil (Math .log (n ) / Math .log (2 )));
12
+ int seg_size = 2 * (int ) Math .pow (2 , x ) - 1 ;
13
+
14
+ this .seg_t = new int [seg_size ];
15
+ this .arr = arr ;
16
+ this .n = n ;
17
+ constructTree (arr , 0 , n - 1 , 0 );
18
+ }
19
+
20
+ /* A function which will create the segment tree*/
21
+ public int constructTree (int [] arr , int start , int end , int index ) {
22
+ if (start == end ) {
23
+ this .seg_t [index ] = arr [start ];
24
+ return arr [start ];
25
+ }
26
+
27
+ int mid = start + (end - start ) / 2 ;
28
+ this .seg_t [index ] = constructTree (arr , start , mid , index *2 + 1 ) +
29
+ constructTree (arr , mid + 1 , end , index *2 + 2 );
30
+ return this .seg_t [index ];
31
+ }
32
+
33
+
34
+ /* A function which will update the value at a index i. This will be called by the
35
+ update function internally*/
36
+ private void updateTree (int start , int end , int index , int diff , int seg_index ) {
37
+ if (index < start || index > end ) {
38
+ return ;
39
+ }
40
+
41
+ this .seg_t [seg_index ] += diff ;
42
+ if (start != end ) {
43
+ int mid = start + (end - start ) / 2 ;
44
+ updateTree (start , mid , index , diff , seg_index *2 + 1 );
45
+ updateTree (mid + 1 , end , index , diff , seg_index *2 + 2 );
46
+ }
47
+ }
48
+
49
+ /* A function to update the value at a particular index*/
50
+ public void update (int index , int value ) {
51
+ if (index < 0 || index > n ) {
52
+ return ;
53
+ }
54
+
55
+ int diff = value - arr [index ];
56
+ arr [index ] = value ;
57
+ updateTree (0 , n - 1 , index , diff , 0 );
58
+ }
59
+
60
+ /* A function to get the sum of the elements from index l to index r. This will be called internally*/
61
+ private int getSumTree (int start , int end , int q_start , int q_end , int seg_index ) {
62
+ if (q_start <= start && q_end >= end ) {
63
+ return this .seg_t [seg_index ];
64
+ }
65
+
66
+ if (q_start > end || q_end < start ) {
67
+ return 0 ;
68
+ }
69
+
70
+ int mid = start + (end - start )/2 ;
71
+ return getSumTree (start , mid , q_start , q_end , seg_index *2 + 1 ) + getSumTree (mid + 1 , end , q_start , q_end , seg_index *2 + 2 );
72
+ }
73
+
74
+ /* A function to query the sum of the subarray [start...end]*/
75
+ public int getSum (int start , int end ) {
76
+ if (start < 0 || end > n || start > end ) {
77
+ return 0 ;
78
+ }
79
+ return getSumTree (0 , n -1 , start , end , 0 );
80
+ }
81
+ }
0 commit comments