树状数组可以修改点查询区间和,其修改和查询都是平衡树级别的
其实它本身就是一颗差不多的树
具体原理这里不再叙述,因为已经忘了。。
下面直接给出相应的函数:
修改点:
void update(int x,int y){ while(x<=n) { c[x]+=y; x+=lowbit(x); }}
查询区间和:
int sum(int x){ int ans=0; while(x>0) { ans+=c[x]; x-=lowbit(x); } return ans;}
在使用树状数组的时候,一定要注意题目给出的数据范围,千万不要忘记开long long
下面给出完整实现,这篇博文确实太水了。。
1 //aininot260 修改点,查询区间和 2 #include3 using namespace std; 4 const int maxn=100005; 5 const int maxm=10005; 6 int n,m; 7 int a[maxn]; 8 int c[maxn]; 9 int lowbit(int x)10 {11 return x&(-x);12 }13 void update(int x,int y)14 {15 while(x<=n)16 {17 c[x]+=y;18 x+=lowbit(x);19 }20 }21 int sum(int x)22 {23 int ans=0;24 while(x>0)25 {26 ans+=c[x];27 x-=lowbit(x);28 }29 return ans;30 }31 int main()32 {33 cin>>n;34 for(int i=1;i<=n;i++) cin>>a[i];35 for(int i=1;i<=n;i++) update(i,a[i]);36 cin>>m;37 for(int i=1;i<=m;i++)38 {39 int x,y,z;40 cin>>x>>y>>z;41 if(x==1) update(y,z);42 if(x==2) cout< <