树状数组

模板

static class FenwickTree {
        int[] arr;
        int[] b;
        int n;

        public FenwickTree(int[] nums) {
            this.arr = nums;
            n = nums.length;
            init(nums);
        }

        private void init(int[] nums) {
            b = new int[n + 1];
            for(int i = 1;i <= nums.length;i++) {
                int k = i;
                while(k <= n) {
                    b[k] += nums[i - 1];
                    k += (k & -k);
                }
            }
        }

        public void update(int i, int val) {
            int tmp = arr[i];
            arr[i] = val;
            int k = i + 1;
            while(k <= n) {
                b[k] -= tmp;
                b[k] += val;
                k += (k & -k);
            }
        }

        public int sum(int l, int r) {
            return sum(r + 1) - sum(l);
        }

        private int sum(int r) {
            int sum = 0;
            while(r > 0) {
                sum += b[r];
                r -= (r & -r);
            }

            return sum;
        }
    }
转载请注明出处