树状数组 java模板(纯代码)

public class TrieNums {
    int n;
    /*Nums start from 0*/
    int[] storage;
    /*TrieNums index start from 1*/
    int[] treeNums;

    int query(int index){
        int ans = 0;
        for(int i=index; i > 0; i -= getLowBit(i)) ans += treeNums[i];
        return ans;
    }

    void add(int index, int increase){
        for(int i = index; i <= n; i += getLowBit(i)) treeNums[i] += increase;
    }
    public TrieNums(int[] nums){
        this.storage = nums;
        this.n = nums.length;
        this.treeNums = new int[n + 1];
        for (int i = 0; i < n; i++) add(i + 1, storage[i]);
    }

    public void update(int index, int val){
        add(index + 1, val - storage[index]);
        storage[index] = val;
    }

    public int sumRange(int left, int right){
        return query(right +1) - query(left);
    }

    public static int getLowBit(int index){
        return index & (-index);
    }

}

  

posted @ 2022-04-04 15:39  茶柒每天要学习  阅读(171)  评论(0编辑  收藏  举报