lc307-Range Sum Query - Mutable 發表於 2016-12-07 | 分類於 leetcode | 0 comments | standard segment tree 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374struct node { node * left = nullptr; node * right = nullptr; int down, up; int val = 0; node(int l, int u):up(u),down(l) {}};class NumArray { int size; node* root;public: node* buildTree(int l, int u, vector<int> &nums) { node* r = new node(l, u); if (l == u) { r->val = nums[l]; return r; } if ((l+u)/2 >= l) r->left = buildTree(l, (l+u)/2, nums); if ((l+u)/2+1 <= u) r->right = buildTree((l+u)/2+1, u, nums); r -> val = ((r->left)?r->left->val:0) + ((r->right)?r->right->val:0); return r; } void updateTree(int i, int val, node* r) { if (r->down == r->up) { r->val = val; return; } int mid = (r->down + r->up)/2; if (mid >= i) { updateTree(i, val, r->left); r -> val = ((r->left)?r->left->val:0) + ((r->right)?r->right->val:0); } else { updateTree(i, val, r->right); r -> val = ((r->left)?r->left->val:0) + ((r->right)?r->right->val:0); } } int sumRangeFromTree(node* r, int l, int u, int i, int j) { if (l == i && u == j) return r->val; else { int m = (l+u)/2; int s1 = (i<=m)?sumRangeFromTree(r->left, l, m, i, min(j,m)):0; int s2 = (j>m)?sumRangeFromTree(r->right, m+1, u, max(i,m+1), j):0; return s1+s2; } } NumArray(vector<int> &nums) { this->size = nums.size(); if (this->size) this->root = buildTree(0, this->size-1, nums); } void update(int i, int val) { updateTree(i, val, this->root); } int sumRange(int i, int j) { return sumRangeFromTree(this->root, 0, size-1, i, j); }};// Your NumArray object will be instantiated and called as such:// NumArray numArray(nums);// numArray.sumRange(0, 1);// numArray.update(1, 10);// numArray.sumRange(1, 2);