线段树求助
查看原帖
线段树求助
1203411
Louis_lxy楼主2024/3/14 19:40

样例都过不了

#include <iostream>
using namespace std;

const int MAX_LEN = 1e5 + 1;

void Build_Tree(int a[], int tree[], int node, int start, int end)
{
	if (start == end)
	{
		tree[node] = a[start];
		return;
	}
	int mid = (start + end) / 2;
	int left_node = node << 1;
	int right_node = (node << 1) | 1;
	Build_Tree(a, tree, left_node, start, mid);
	Build_Tree(a, tree, right_node, mid + 1, end);
	tree[node] = tree[left_node] + tree[right_node];
}

void Update_Tree(int a[], int tree[], int node, int start, int end, int idx, int val)
{
	if (start == end)
	{
		a[idx] += val;
		tree[node] += val;
		return;
	}
	int mid = (start + end) / 2;
	int left_node = node << 1;
	int right_node = (node << 1) | 1;
	if (idx < mid)
		Update_Tree(a, tree, left_node, start, mid, idx, val);
	else
		Update_Tree(a, tree, right_node, mid + 1, end, idx, val);
	tree[node] = tree[left_node] + tree[right_node];
}

int Query_Tree(int a[], int tree[], int node, int start, int end, int l, int r)
{
	if (end < l || start > r)
		return 0;
	else if (l <= start && end <= r)
		return tree[node];
	int mid = (start + end) / 2;
	int left_node = node << 1;
	int right_node = (node << 1) | 1;
	return Query_Tree(a, tree, left_node, start, mid, l, r) +
		   Query_Tree(a, tree, right_node, mid + 1, end, l, r);
}

int main()
{
	int n, m, a[MAX_LEN], tree[MAX_LEN];
	cin >> n >> m;
	for (int i = 1; i <= n; ++i)
		cin >> a[i];
	Build_Tree(a, tree, 1, 1, n);
//	for (int i = 1; i <= 15; ++i)
//		cout << "tree[" << i << "] = " << tree[i] << endl;
	for (int i = 1; i <= m; ++i)
	{
		int flag;
		cin >> flag;
		if (flag & 1)
		{
			int idx, val;
			cin >> idx >> val;
			Update_Tree(a, tree, 1, 1, n, idx, val);
//			for (int i = 1; i <= 15; ++i)
//				cout << "tree[" << i << "] = " << tree[i] << endl;
		}
		else
		{
			int l, r;
			cin >> l >> r;
			cout << Query_Tree(a, tree, 1, 1, n, l, r) << endl;
		}
	}
}
//6
//1 3 5 7 9 11
//2
//1 4 6
//0 3 5
2024/3/14 19:40
加载中...