Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
The update(i, val) function modifies nums by updating the element at index i to val . Example:
Given nums = [1, 3, 5] sumRange(0, 2) -> 9 update(1, 2) sumRange(0, 2) -> 8
Note:
- The array is only modifiable by the update function.
- You may assume the number of calls to update and sumRange function is distributed evenly.
线段树模板题。
public class NumArray {
SegmentTree2 segtree;
int len;
public NumArray(int[] nums)
{
len=nums.length;
segtree=new SegmentTree2(len);
segtree.build(1, len, 1, nums);
}
void update(int i, int val)
{
segtree.update(i+1, val, 1, len, 1);
}
public int sumRange(int i, int j)
{
return (int) segtree.query(i+1, j+1, 1, len, 1);
}
}
class SegmentTree2
{
private long[] ele;
int cnt=0;
public SegmentTree2(int maxn)
{
ele = new long[maxn << 2];
}
public void build(int l, int r, int rt,int[] arr)
{
if(arr.length<1)
return ;
if (l == r)
{
ele[rt] = arr[cnt++];
return;
}
int m = (l + r) >> 1;
build(l, m, rt << 1,arr);
build(m + 1, r, rt << 1 | 1,arr);
PushUP(rt);
}
private void PushUP(int rt)
{
ele[rt] = ele[rt << 1] + ele[rt << 1 | 1];
}
public void update(int p, int sc, int l, int r, int rt)
{
if(ele.length<1)
return ;
if (l == r)
{
ele[rt] = sc;
return;
}
int m = (l + r) >> 1;
if (p <= m)
update(p, sc, l, m, rt << 1);
else
{
update(p, sc, m + 1, r, rt << 1 | 1);
}
PushUP(rt);
}
public long query(int L, int R, int l, int r, int rt)
{
if(ele.length<1)
return 0;
if (L <= l && r <= R)
return ele[rt];
int m = (l + r) >> 1;
long ret = 0;
if (L <= m)
ret += query(L, R, l, m, rt << 1);
if (R > m)
ret += query(L, R, m + 1, r, rt << 1 | 1);
return ret;
}
}