Skip to content

Commit acb9cf4

Browse files
MEDIUM/src/medium/RangeSumQueryMutable.java
1 parent 61a3d6b commit acb9cf4

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package medium;
2+
3+
public class RangeSumQueryMutable {
4+
5+
public static void main(String...strings){
6+
// int[] nums = new int[]{1,3,5};
7+
8+
int[] nums = new int[]{7,2,7,2,0};
9+
NumArray test = new NumArray(nums);
10+
test.update(4,6);
11+
test.update(0,2);
12+
test.update(0,9);
13+
}
14+
}
15+
16+
class NumArray {
17+
class SegmentTreeNode{
18+
SegmentTreeNode left;
19+
SegmentTreeNode right;
20+
int start;
21+
int end;
22+
int sum;
23+
24+
public SegmentTreeNode(int start, int end){
25+
this.start = start;
26+
this.end = end;
27+
this.left = null;
28+
this.right = null;
29+
this.sum = 0;
30+
}
31+
}
32+
33+
private SegmentTreeNode root = null;
34+
35+
public NumArray(int[] nums) {
36+
root = buildSegmentTree(nums, 0, nums.length-1);
37+
}
38+
39+
SegmentTreeNode buildSegmentTree(int[] nums, int start, int end){
40+
if(start > end){
41+
return null;
42+
} else {
43+
SegmentTreeNode root = new SegmentTreeNode(start, end);
44+
if(start == end){
45+
root.sum = nums[start];
46+
} else {
47+
int mid = start + (end-start)/2;
48+
root.left = buildSegmentTree(nums, start, mid);
49+
root.right = buildSegmentTree(nums, mid+1, end);
50+
root.sum = root.left.sum + root.right.sum;
51+
}
52+
return root;
53+
}
54+
}
55+
56+
void update(int i, int val) {
57+
update(root, i, val);
58+
}
59+
60+
void update(SegmentTreeNode root, int pos, int val){
61+
if(root.start == root.end){
62+
root.sum = val;
63+
} else {
64+
int mid = root.start + (root.end - root.start)/2;
65+
if(pos <= mid){
66+
update(root.left, pos, val);
67+
} else {
68+
update(root.right, pos, val);
69+
}
70+
root.sum = root.left.sum + root.right.sum;
71+
}
72+
}
73+
74+
public int sumRange(int i, int j) {
75+
return sumRange(root, i, j);
76+
}
77+
78+
int sumRange(SegmentTreeNode root, int start, int end){
79+
if(root.end == end && root.start == start){
80+
return root.sum;
81+
} else {
82+
int mid = root.start + (root.end-root.start)/2;
83+
if(end <= mid){
84+
return sumRange(root.left, start, end);
85+
} else if(start >= mid+1){
86+
return sumRange(root.right, start, end);
87+
} else {
88+
return sumRange(root.right, mid+1, end) + sumRange(root.left, start, mid);
89+
}
90+
}
91+
}
92+
}
93+

0 commit comments

Comments
 (0)