classNumArray{public:NumArray(vector<int>& nums):num(nums){int n = num.size();
size =sqrt(n);//分成根号n最优
sum.resize((n+size-1)/size,0);int cnt =0;for(auto elem : num){
sum[cnt/size]+= num[cnt];//分块统计区间和
cnt++;}}voidupdate(int index,int val){
sum[index/size]+=(val-num[index]);
num[index]= val;}intsumRange(int left,int right){int b1 = left/size,b2 = right/size,l = left%size,r = right%size;//获取块号和当前快的idint ans =0;if(b1 == b2){//如果在一块中,直接进行块间遍历查询
ans =accumulate(num.begin()+b1*size+l,num.begin()+b1*size+r+1,0);}else{int sum1 =accumulate(num.begin()+b1*size+l,num.begin()+b1*size+size,0);//块间统计int sum2 =accumulate(num.begin()+b2*size,num.begin()+b2*size+r+1,0);//统计快数和int sum3 =accumulate(sum.begin()+b1+1,sum.begin()+b2,0);//后面快间统计
ans = sum1+sum2+sum3;}return ans;}private:
vector <int> num;
vector <int> sum;int size;};/**
* 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);
*/
树状数组
classNumArray{public:intlowbit(int x){//获取最低为连续0return x&(-x);}NumArray(vector<int>& nums):nums(nums){
n = nums.size();
C.resize(n+10,0);for(int i =0;i < nums.size();++i){upda(i+1,nums[i],n);}}voidupda(int index,int val,int n){while(index <= n){
C[index]+= val;
index +=lowbit(index);}}voidupdate(int index,int val){//单点更新upda(index+1,val-nums[index],n);
nums[index]= val;}intgetsum(int index){//单点前缀查询int res =0;while(index >0){
res += C[index];
index -=lowbit(index);}return res;}intsumRange(int left,int right){//区间查询returngetsum(right+1)-getsum(left);}private:
vector<int>C,nums;//创建树状数组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);
*/