树桩数组模板
#define lowbit(x) (x)&(-x) //查找父节点
const int N = 1e6+6;
int bit[N],n;
// 减法的时候就 +(-x),单点修改
void add(int i,int x){
while(i <= n){
bit[i]+=x;
i=lowbit(i);
}
}
// sum是1~i的和
// sum[l,r] = sum(r) - sum(l-1)
int sum(int i){
int s = 0;
while(i > 0){
s+=bit[i];
i = lowbit(i);
}
return s
}
创建树状数组
for (int i = 1; i <= n; ++i) {
scanf ("%d", &a[i]);
add (i, a[i]);
}
求最值的代码参考了这篇博客 。
因为求最值的模板不好背,代码被我删掉了
大佬有新的写法,可以去看看 链接