树状数组(Binary Indexed Tree / Fenwick Tree)是一种支持单点修改和前缀和查询的数据结构,两个操作都是 O(log n)。它比线段树代码短得多,常用来处理「频繁更新 + 频繁查询前缀和」的场景。
核心思想:利用二进制的 lowbit(最低位的1)把数组组织成一棵"树"。每个节点管辖一段区间的和,通过不断跳 parent 可以快速求前缀和。
add(i, v):将第 i 个元素增加 vsum(l, r):查询区间 [l, r] 的和#include <iostream>
using namespace std;
int n, tree[100005];
int lowbit(int x) { return x & (-x); }
void add(int i, int v) { while (i <= n) { tree[i] += v; i += lowbit(i); } }
int query(int i) { int s = 0; while (i > 0) { s += tree[i]; i -= lowbit(i); } return s; }
int main() {
n = 5; int a[] = {0, 3, 1, 4, 1, 5};
for (int i = 1; i <= n; i++) add(i, a[i]);
cout << query(3) - query(0) << endl; // sum(1,3) = 8
add(2, 10); // a[2] += 10
cout << query(5) - query(2) << endl; // sum(3,5) = 4+1+5=10
}