之前翻帖子有大概的聽過這樣一種數據結構,今天剛好刷題遇到了,記錄一下自己寫的吧!(沒有加懶惰標記!!!)
class NumArray {
public:
int tree[100000] = {0};
int n = 0;
void buildTree(vector<int> &num,int l,int r,int rt){
if(l == r){
tree[rt] = num[l-1];
return;
}
int mid = (l+r)/2;
buildTree(num,l,mid,rt*2);
buildTree(num,mid+1,r,rt*2+1);
tree[rt] = tree[rt*2]+tree[rt*2+1];
}
NumArray(vector<int>& nums) {
if(nums.size()==0)return;
n = nums.size();
buildTree(nums,1,nums.size(),1);
}
void ud(int l,int r,int i,int val,int rt){
if(l == r){
int temp = tree[rt];
//tree[rt] = val;
while(rt > 0){
tree[rt] = tree[rt]-temp+val;
rt = rt/2;
}
return;
}else{
int mid = (l+r)/2;
if(i <= mid) ud(l,mid,i,val,rt*2);
else if(i > mid)ud(mid+1,r,i,val,rt*2+1);
}
}
void update(int i, int val) {
ud(1,n,i+1,val,1);
}
int sum(int l,int r,int i,int j,int rt){
if(l == i&&r == j)return tree[rt];
int mid = (l+r)/2;
if(j <= mid) return sum(l,mid,i,j,rt*2);
else if(i > mid) return sum(mid+1,r,i,j,rt*2+1);
else{
return sum(l,mid,i,mid,rt*2)+sum(mid+1,r,mid+1,j,rt*2+1);
}
}
int sumRange(int i, int j) {
return sum(1,n,i+1,j+1,1);
}
};