樹狀數組可以修改點查詢區間和,其修改和查詢都是平衡樹級別的
其實它本身就是一顆差不多的樹
具體原理這里不再敘述,因為已經忘了。。
下面直接給出相應的函數:
修改點:
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 #include<iostream> 3 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<<sum(z)-sum(y-1)<<endl; 43 } 44 return 0; 45 }