树状数组的使用
1.树状数组解决的问题
(1)解决动态前缀和的数据结构
(2)求(ai -aj)位置的和,1<= i <= j <= n
(3) a[i]位置会动态加上某个数 1<= i <= n
2.树状数组核心代码
int lowbit(int u) { return u & - u; } int add(int u,int k) //在u位置加上k { for(int i = u;i <= n;i +=lowbit(i)) t[i] += k; } int getsum(int u) //求1 - u 的和 { int res = 0; while(u > 0) { res += t[u]; u -= lowbit(u); } return res; }
3.实例运用
(1)
(2)代码
#include <bits/stdc++.h> using namespace std; const int N = 100010; int n,m; int s[N],t[N]; int lowbit(int u) { return u & - u; } int add(int u,int k) { for(int i = u;i <= n;i +=lowbit(i)) t[i] += k; } int getsum(int u) { int res = 0; while(u > 0) { res += t[u]; u -= lowbit(u); } return res; } int main() { cin >> n >> m; for(int i = 1;i <= n;i ++) { cin >> s[i]; add(i,s[i]); //在i的位置加上s[i] 数组初始化 } while(m --) { int a,b,c; cin >> a >> b >> c; if(a == 1) add(b,c); //在b的位置加上c 数组动态变化 else cout << getsum(c) - getsum(b - 1) << endl; //求c - b 的和 } return 0; }