树状数组模板

# include 
# include 

class TreeArray {
    typedef long long value_t;

    private:
        value_t *p;
        int size;
    
    public:
        TreeArray(int n): size(n+1) {
            p = (value_t *)malloc(size * sizeof(value_t));
            for (int i = 0; i < size; i++) *(p+i) = 0;
        }
        
        ~TreeArray() {
            free(p);
        }
        
        void update(int i, value_t val) {
            for (; i < size; i += (i & -i)) {
                *(p + i) += val;
            }
        }
        
        value_t sum(int i) {
            value_t ret = 0;
            for (; i > 0; i -= (i & -i)) {
                ret += *(p + i);
            }
            return ret;
        }
};

int main(void) {
  TreeArray s(3);
  s.update(1, 1);
  s.update(2, 3);
  s.update(3, 5);
  printf("%lld\n", s.sum(3));
  s.update(2, 2);
  printf("%lld\n", s.sum(3));
}

[1] Leetcode 307. Range Sum Query - Mutable

class NumArray {
public:
    TreeArray s;

    NumArray(vector& nums): s(nums.size()) {
        for (int i = 0; i < nums.size(); i++) {
            s.update(i+1, nums[i]);
        }
    }
    
    void update(int i, int val) {
        long long cur_val = this->sumRange(i, i);
        s.update(i+1, val-cur_val);
    }
    
    int sumRange(int i, int j) {
        return s.sum(j+1) - s.sum(i);
    }
};

你可能感兴趣的:(树状数组模板)