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
| class NumArray { public: NumArray(vector<int>& nums):arr(nums), tree(arr.size()*4) { _buildTree(0, 0, arr.size() - 1); }
void update(int index, int val) { _update(0, 0, arr.size() - 1, index, val); }
int sumRange(int left, int right) { return _sumRange(0, 0, arr.size() - 1, left, right); } private: void _buildTree(int node, int start, int end) { if (start == end) { tree[node] = arr[start]; return; } int mid = (start + end) / 2; int node_left = node * 2 + 1; int node_right = node * 2 + 2; _buildTree(node_left, start, mid); _buildTree(node_right, mid + 1, end); tree[node] = tree[node_left] + tree[node_right]; }
void _update(int node, int start, int end, int idx, int val) { if (start == end) { arr[idx] = val; tree[node] = val; return; } int mid = (start + end) / 2; int node_left = node * 2 + 1; int node_right = node * 2 + 2; if (idx <= mid) _update(node_left, start, mid, idx, val); else _update(node_right, mid + 1, end, idx, val); tree[node] = tree[node_left] + tree[node_right]; }
int _sumRange(int node, int start, int end, int l, int r) { if (l > end || r < start) return 0; if (start >= l && end <= r) return tree[node]; int mid = (start + end) / 2; int node_left = node * 2 + 1; int node_right = node * 2 + 2; return _sumRange(node_left, start, mid, l, r) + _sumRange(node_right, mid + 1, end, l, r); } vector<int> arr; vector<int> tree; };
|