zl程序教程

您现在的位置是:首页 >  其它

当前栏目

【ybt高效进阶4-2-1】单点修改区间查询

查询 修改 高效 进阶 区间 单点 ybt
2023-09-27 14:28:29 时间

单点修改区间查询

题目链接:ybt高效进阶4-2-1

题目大意

模板题。
给一个序列,维护给一个数加一个值和求区间和的操作。

思路

就是一道普通的树状数组,没什么好说的。
区间和可以用前缀和的方式来实现。

代码

#include<cstdio>
#define ll long long

using namespace std;

ll tree[1000001];
int n, q, op, x, y;

void add(int x, ll y) {
	for (int i = x; i <= n; i += i & (-i))
		tree[i] += y;
}

ll ask(int x) {
	ll re = 0;
	for (int i = x; i; i -= i & (-i))
		re += tree[i];
	return re;
}

ll get_ans(int l, int r) {
	return ask(r) - ask(l - 1);
}

int main() {
	scanf("%d %d", &n, &q);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &x);
		add(i, 1ll * x);
	}
	
	for (int i = 1; i <= q; i++) {
		scanf("%d %d %d", &op, &x, &y);
		if (op == 1) add(x, 1ll * y);
			else printf("%lld\n", get_ans(x, y));
	}
	
	return 0;
}