原理:
    image.png
    image.png
    image.png

    模板:

    1. int[] tr = new int[];
    2. int lowbit(int x) {
    3. return x & -x;
    4. }
    5. void add(int x, int u) {
    6. for (int i = x; i <= n; i += lowbit(i)) {
    7. tr[i] += u;
    8. }
    9. }
    10. int query(int x) {
    11. int ans = 0;
    12. for (int i = x; i > 0; i -= lowbit(i)) {
    13. ans += tr[i];
    14. }
    15. return ans;
    16. }

    使用方法:

    1. //原数组
    2. nums
    3. n = nums.length;
    4. //初始化
    5. for (int i = 0; i < n; ++i) add(i + 1, nums[i]);
    6. //单点修改 改下标为index的值为value
    7. public void update(int index, int val) {
    8. add(index + 1, val - nums[index]);
    9. //nums[index] = val;
    10. }
    11. //单点查询
    12. public int sumRange(int index) {
    13. return query(index + 1) - query(index);
    14. }
    15. //区间查询
    16. public int sumRange(int left, int right) {
    17. return query(right + 1) - query(left);
    18. }
    19. //区间修改
    20. public void update(int left, int right, int u) {
    21. add(left + 1, u);
    22. add(right + 2, -u);
    23. }