1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| class NumArray { private: vector<int> tree; int n; int build(int node, int l, int r, const vector<int>& nums) { if(l == r) tree[node] = nums[l]; else { int mid = (r - l) / 2 + l; tree[node] = build(2*node+1, l, mid, nums) + build(2*node+2, mid+1, r, nums); } return tree[node]; } void updateTree(int node, int index, int l, int r, int val) { if(l == r) tree[node] = val; else { int mid = (r - l) / 2 + l; if(index <= mid) { updateTree(node*2+1, index, l, mid, val); } else { updateTree(node*2+2, index, mid+1, r, val); } tree[node] = tree[2*node+1] + tree[2*node+2]; } } int sumTree(int node, int left, int right, int l, int r) { if(left == l && right == r) { return tree[node]; } int mid = (r - l) / 2 + l; if(left > mid) { return sumTree(node*2+2, left, right, mid+1, r); } else if(right <= mid) { return sumTree(node*2+1, left, right, l, mid); } else { return sumTree(node*2+1, left, mid, l, mid) + sumTree(2*node+2, mid+1, right, mid+1, r); } } public: NumArray(vector<int>& nums) { n = nums.size(); tree = vector<int>(n * 4); build(0, 0, n-1, nums); } void update(int index, int val) { updateTree(0, index, 0, n-1, val); } int sumRange(int left, int right) { return sumTree(0, left, right, 0, n-1); } };
|