树状数组

这是一个用于实现单点修改以及区间求和查询的数据结构,修改和求和复杂度均为O(lgn)。存储的方式已经在清北学堂的本子上进行了推导,直接写代码。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#define maxn 10000001
using namespace std;
int a[maxn],c[maxn];
int n,m;
int lowbit(int k){
return k & -k;
}
void add(int x,int k){//单点修改
while(x<=n){
c[x]+=k;//还原最高位的一
x+=lowbit(x);
}
}
int sum(int x){//区间查询
int ans=0;
while(x>0){//最高位去掉一
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
add(i,a[i]);
}
int q;
int x,k;
for(int i=1;i<=m;i++){
cin>>q>>x>>k;
if(q==1){
add(x,k);
}
else if(q==2){
cout<<sum(k)-sum(x-1)<<endl;
}
}
return 0;
}

posted @ 2019-10-12 16:42  毛炯人  阅读(80)  评论(2编辑  收藏  举报