线段树

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);
}
posted @ 2021-04-03 10:01  你看码!!!  阅读(48)  评论(0)    收藏  举报