class NumArray {
public:
vector<int> tree;
int n;
NumArray(vector<int> nums) {
n = nums.size();
tree.resize(n * 2);
for (int i = n; i < 2 * n; i++) {
tree[i] = nums[i - n];
}
for (int i = n - 1; i >= 0; i--) {
tree[i] = tree[i * 2] + tree[i * 2 + 1];
}
}
void update(int i, int val) {
int pos = n + i;
tree[pos] = val;
while (pos > 0) {
int left = pos % 2 == 0 ? pos : pos - 1;
int right = pos % 2 == 0 ? pos + 1 : pos;
tree[pos / 2] = tree[left] + tree[right];
pos /= 2;
}
}
int sumRange(int i, int j) {
int sum = 0;
int l = n + i;
int r = n + j;
while (r >= l) {
if (l % 2 == 1) {
sum += tree[l];
l++;
}
if (r % 2 == 0) {
sum += tree[r];
r--;
}
l /= 2;
r /= 2;
}
return sum;
}
};
09-21
09-21