分块优化树状数组操作.
$O(1)$单点修改, $O(sqrt{n})$区间查询.
const int N = 1e6+10, S = 400; int s1[N], s2[N]; void add(int x, int v) { s1[x] += v; s2[x/S] += v; } int qry(int x) { int ans = 0; for (int i=x/S*S; i<=x; ++i) ans+=s1[i]; for (int i=x/S-1; i>=0; --i) ans+=s2[i]; return ans; }
$O(1)$单点查询, $O(sqrt{n})$区间修改.
void add(int x, int v) { for (int i=x/S*S; i<=x; ++i) s1[i]+=v; for (int i=x/S-1; i>=0; --i) s2[i]+=v; } int qry(int x) { return s1[x]+s2[x/S]; }