class segmentTree
{
public:
void buildTree(int parr[], int root, int start, int end)// parr[]:待处理数组,root:根节点下标,start区间开始,end:区间结束;
{
if (start == end)
{
treeArr[root] = parr[start];
return;
}
int mid = (start + end) / 2;
int left = 2 * root + 1, right = 2 * root + 2;
buildTree(parr, left, start, mid);
buildTree(parr, right, mid + 1, end);
treeArr[root] = treeArr[left] + treeArr[right];
}
void updata(int index, int val) {
updata(root, start, end, index, val);
}
void updata(int root, int start, int end, int index, int val)
{
if (start == end)
{
treeArr[root] = val;
return;
}
int mid = (start + end) / 2;
int left = 2 * root + 1, right = 2 * root + 2;
if (index <= mid)
updata(left, start, mid, index, val);
else
updata(right, mid + 1, end, index, val);
treeArr[root] = treeArr[left] + treeArr[right];
}
int getSum(int left, int right)const
{
return getSum(root, start, end, left, right);
}
int getSum(int root, int start, int end, int left, int right)const
{
if (end < left || start > right)
return 0;
else if (end <= right && start >= left)
return treeArr[root];
int mid = (start + end) / 2;
int left_root = 2 * root + 1, right_root = 2 * root + 2;
int sum_l = getSum(left_root, start, mid, left, right);
int sum_r = getSum(right_root, mid + 1, end, left, right);
return sum_l + sum_r;
}
segmentTree() {};
segmentTree(int parr[], int n) {
flag = 1;
end = n - 1;
treeArr = new int[4 * (n + 1)];
buildTree(parr, root, start, end);
}
~segmentTree() {
if (flag)
delete treeArr;
}
private:
int* treeArr;
int root = 0, start = 0, end;
int flag = 0;
};
/****************************************************/
int tree[10000000];
int pre[10000000];
void buildtree(int node, int start, int end)
{
if (start == end)
{
tree[node] = pre[start];
return;
}
int mid = (start + end) / 2;
int l_node = 2 * node + 1;
int r_node = 2 * node + 2;
buildtree(l_node, start, mid);
buildtree(r_node, mid + 1, end);
tree[node] = tree[l_node] + tree[r_node];
}
void updata(int node, int start, int end, int pos, int val) {
if (start == end)
{
tree[node] += val;
return;
}
int mid = (start + end) / 2;
int l_node = 2 * node + 1;
int r_node = 2 * node + 2;
if (pos <= mid)
updata(l_node, start, mid, pos, val);
else
updata(r_node, mid + 1, end, pos, val);
tree[node] = tree[l_node] + tree[r_node];
}
int getsum(int node, int start, int end, int left, int right)
{
if (start >= left && end <= right)
return tree[node];
else if (start > right || end < left)
return 0;
int mid = (start + end) / 2;
int l_node = 2 * node + 1;
int r_node = 2 * node + 2;
return getsum(l_node, start, mid, left, right) + getsum(r_node, mid + 1, end, left, right);
}