线段树 RE 求助
查看原帖
线段树 RE 求助
481337
FwbAway楼主2024/9/16 12:10

RE 了 #2#9#10 三个点,求各位大佬帮我看看,谢谢啦。

以下是我的代码(本人第一次线段树代码,简单错误还请勿喷):

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 510000;
int n, m, a[N];
int id, x, y;
struct Tree {
	int l, r;
	int num;
} tree[N];
inline void build(int u, int l, int r) {
	tree[u].l = l, tree[u].r = r;
	if (l == r) {
		tree[u].num = a[l];
		return ;
	}
	int mid = l + r >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	tree[u].num = tree[u << 1].num + tree[u << 1 | 1].num;
}
inline void add(int u, int dis, int k) {
	if (tree[u].l == tree[u].r) {
		tree[u].num += k;
		return ;
	}
	if (tree[u << 1].r >= dis) add(u << 1, dis, k); 
	else add(u << 1 | 1, dis, k);
	tree[u].num = tree[u << 1].num + tree[u << 1 | 1].num;
}
inline int search(int u, int l, int r) {
//	cout << "u=[" << tree[u].l << "," << tree[u].r << "]; " << tree[u].num << endl;
	if (tree[u].l >= l && tree[u].r <= r) {
		return tree[u].num;
	}
	if (tree[u].l > r || tree[u].r < l) return 0;
	int sum = 0;
	if (tree[u << 1].r >= l) sum += search(u << 1, l, r);
	if (tree[u << 1 | 1].l <= r) sum += search(u << 1 | 1, l, r);
	return sum;
}
signed main() {
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
	}
	build(1, 1, n);
	for (int i = 1; i <= m; i++) {
		scanf("%lld %lld %lld", &id, &x, &y);
		if (id == 1) {
			add(1, x, y);
		} else {
			printf("%lld\n", search(1, x, y));
		}
	}
	return 0;
}
2024/9/16 12:10
加载中...