具体思想:
区间单值修改+求和的题;
这里要注意一下l,r和cl,cr的思想;
求区间和的的l,r应该是固定的,通过缩小cl,cr来确定区间所处区间,cl,cr进行削减;
总共有三种情况:
具体代码:
struct node{
int l,r,v,add;
node(int _l,int _r){
l=_l;
r=_r;
v=0;
add=0;
}
};
class NumArray {
public:
NumArray(vector<int>& nums) {
int len=50000;
tree.resize(len*4);
n=nums.size();
build(nums, 1, 0 ,nums.size()-1);
int cnt=0;
}
int build(vector<int>& nums,int root,int l,int r){
tree[root]=new node(l,r);
if(l==r){
tree[root]->v=nums[l];
return tree[root]->v;
}
int mid=l+(r-l)/2;
tree[root]->v=build(nums, root<<1, l, mid)+build(nums, root<<1|1, mid+1, r);
return tree[root]->v;
}
void update(int index, int val) {
change(index,val,1,0,n-1);
}
int sumRange(int left, int right) {
return query(1,left, right,0,n-1);
}
void change(int index,int val,int root,int l,int r){
if(l==r){
tree[root]->v=val;
return;
}
int mid=l+(r-l)/2;
if(index<=mid){
change(index, val,root<<1,l,mid);
}else{
change(index,val,root<<1|1,mid+1,r);
}
tree[root]->v=tree[root<<1]->v+tree[root<<1|1]->v;
}
int query(int root,int l,int r,int cl,int cr){
if(l==cl&&cr==r)
return tree[root]->v;
int mid=cl+(cr-cl)/2;
if(r<=mid){
return query(root*2,l,r,cl,mid);
}
if(l>mid){
return query(root*2+1, l, r,mid+1, cr);
}
return query(root<<1, l, mid, cl, mid)+query(root<<1|1, mid+1, r, mid+1, cr);
}
private:
vector<node*>tree;
int n;
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray* obj = new NumArray(nums);
* obj->update(index,val);
* int param_2 = obj->sumRange(left,right);
*/```