int querySegTree(int treeIndex, int lo, int hi, int i, int j)
{
// 查询 arr[i..j]
if (lo > j || hi < i) // 片段完全超出范围
return 0; // 表示一个null节点
if (i <= lo && j >= hi) // 片段完全在范围内
return tree[treeIndex];
int mid = lo + (hi - lo) / 2; // 当前片段与查询范围有部分重合。递归到深一层。
if (i > mid)
return querySegTree(2 * treeIndex + 2, mid + 1, hi, i, j);
else if (j <= mid)
return querySegTree(2 * treeIndex + 1, lo, mid, i, j);
int leftQuery = querySegTree(2 * treeIndex + 1, lo, mid, i, mid);
int rightQuery = querySegTree(2 * treeIndex + 2, mid + 1, hi, mid + 1, j);
// 合并查询结果
return merge(leftQuery, rightQuery);
}
// call this method as querySegTree(0, 0, n-1, i, j);
// Here [i,j] is the range/interval you are querying.
// This method relies on "null" nodes being equivalent to storing zero.
void updateValSegTree(int treeIndex, int lo, int hi, int arrIndex, int val)
{
if (lo == hi) { // 叶子节点,更新元素值.
tree[treeIndex] = val;
return;
}
int mid = lo + (hi - lo) / 2; // 向更深层递归以查找对应节点
if (arrIndex > mid)
updateValSegTree(2 * treeIndex + 2, mid + 1, hi, arrIndex, val);
else if (arrIndex <= mid)
updateValSegTree(2 * treeIndex + 1, lo, mid, arrIndex, val);
// 合并更新结果
tree[treeIndex] = merge(tree[2 * treeIndex + 1], tree[2 * treeIndex + 2]);
}
// call this method as updateValSegTree(0, 0, n-1, i, val);
// Here you want to update the value at index i with value val.