封装树状数组,喜欢点个赞 ver 1.0
2025-08-04 13:36:05
发布于:上海
2阅读
0回复
0点赞
封装功能
lowbit:查找i在二进制下的最低位1对应的权重
update:单点修改(将位置p的元素增加x)
init:初始化树状数组
ask:前缀和查询∑(k,i=1)a_i
query:区间[l,r]的数的和的查询
#include<bits/stdc++.h>
using namespace std;
const int _N=5e5+5;
struct TreeArray{
int f[_N]={};
int n;
int lowbit(int x){
return x & (-x);
}
void update(int p,int x){
while(p<=n){
f[p]+=x;
p+=lowbit(p);
}
return;
}
void init(int a[],int l){
n=l;
for(int i=1;i<=n;i++){
update(i,a[i]);
}
}
int ask(int k){
int res=0;
while(k>0){
res+=f[k];
k-=lowbit(k);
}
return res;
}
int query(int l,int r){
return ask(r)-ask(l-1);
}
};
int main(){
int n,m;
cin>>n>>m;
TreeArray t;
int a[_N];
for(int i=1;i<=n;i++){
cin>>a[i];
}
t.init(a,n);
while(m--){
int op,x,y;
cin>>op>>x>>y;
if(op==1){
t.update(x,y);
}
else{
cout<<t.query(x,y)<<endl;
}
}
}
这里空空如也
有帮助,赞一个