给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。
示例:
Given nums = [1, 3, 5] sumRange(0, 2) -> 9 update(1, 2) sumRange(0, 2) -> 8
线段树模版题
class NumArray {
public:
int* tree;
int size;
NumArray(vector<int> nums) {
size = nums.size();
tree = new int[size << 2];
if (size != 0)
build(1, size, 1, nums);
}
void pushup(int rt){
tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];
}
void build(int l, int r, int rt, vector<int>& nums){
if (l == r){
tree[rt] = nums[l - 1];
return;
}
int m = (l + r) >> 1;
build(l, m, rt << 1, nums);
build(m + 1, r, rt << 1 | 1, nums);
pushup(rt);
}
void update(int p, int val, int l , int r, int rt){
if (l == r){
tree[rt] = val;
return;
}
int m = (l + r) >> 1;
if (p <= m)
update(p, val, l, m, rt << 1);
else
update(p, val, m + 1, r, rt << 1 | 1);
pushup(rt);
}
int query(int L, int R, int l, int r, int rt){
if (L <= l && r <= R){
return tree[rt];
}
int m = (l + r) >> 1;
int ans = 0;
if (L <= m)
ans += query(L, R, l, m, rt << 1);
if (R >= m + 1)
ans += query(L, R, m + 1, r, rt << 1 | 1);
return ans;
}
void update(int i, int val) {
update(i + 1, val, 1, size, 1);
}
int sumRange(int i, int j) {
return query(i + 1, j + 1, 1, size, 1);
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* obj.update(i,val);
* int param_2 = obj.sumRange(i,j);
*/
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。
示例:
Given nums = [1, 3, 5] sumRange(0, 2) -> 9 update(1, 2) sumRange(0, 2) -> 8