int lowbit(int x) {
return x & (x ^ (x – 1));
}
利用机器补码的特性,也可以写成
int lowbit(int x) {
return x & -x;
}
int getsum(int x) {
int res = 0;
for (; x; x -= x & (-x))
res += t[x];
return res;
}
int change(int x) {
for (; x <= maxn; x += x & (-x))
t[x]++;
}
树状数组的模板如下:
#include <iostream>
using namespace std;
const int MAX_N = 10010;
int C[MAX_N];
int n;
int lowbit(int x){
return x & (-x);
}
int getsum(int x){
int res = 0;
for(;x; x-= lowbit(x)){
res += C[x];
}
return res;
}
void change(int x,int c){
for(;x<=n;x+=x & (-x)){
C[x] += c;
}
}
int main() {
cin>>n;
//输入n个数调用change更新到树状数组的区间中
for(int i=1;i<=n;i++){
int d;
cin>>d;
change(i,d);
}
//输出查询的结果 调用getsum查询 从a1 + a2 + .... + ai的和
for(int i=1;i<=n;i++){
cout<<getsum(i)<<" ";
}
return 0;
}