求助
  • 板块灌水区
  • 楼主Lian_zy
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/18 15:33
  • 上次更新2023/11/18 15:49:46
查看原帖
求助
923248
Lian_zy楼主2023/11/18 15:33

线段树板子写炸了

大佬帮找找错吧

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 1e5 + 10;
long long n, m, op, x, y, a[maxn], w[maxn << 2], lazy_tag[maxn << 2];
bool in_range(long long L, long long R, long long l, long long r) {
	return L >= l && R <= r;
}
bool out_range(long long L, long long R, long long l, long long r) {
	return r < L || R < l;
}
void push_up(long long u) {
	w[u] = w[u << 1] + w[(u << 1) + 1];
	return ;
}
void make_tag(long long u, long long l, long long r, long long x) {
	lazy_tag[u] += x;
	w[u] += (r - l + 1) * x;
	return ; 
}
void push_down(long long u, long long l, long long r) {
	make_tag(u << 1, l, l + r >> 1, lazy_tag[u]);
	make_tag((u << 1) + 1, (l + r >> 1) + 1, r, lazy_tag[u]);
	lazy_tag[u] = 0;
	return ;
}
void build(long long u, long long l, long long r) {
	if (l == r) {
		w[u] = a[l];
		return ;
	}
	build(u << 1, l, l + r >> 1);
	build((u << 1) + 1, (l + r >> 1) + 1, r);
	push_up(u);
	return ;
}
void update_point(long long u, long long l, long long r, long long p, long long x) {
	if (l == r) {
		w[u] += x;
		return ;
	}
	if (p <= (l + r >> 1)) update_point(u << 1, l, l + r >> 1, p, x);
	else update_point((u << 1) + 1, (l + r >> 1) + 1, r, p, x);
	push_up(u);
	return ;
	
}
void update(long long u, long long l, long long r, long long L, long long R, long long x) {
	if (out_range(l, r, L, R)) return ;
	if (in_range(l, r, L, R)) {
		make_tag(u, l, r, x);
		return ;
	}
	push_down(u, l, r);
	update(u << 1, l, l + r >> 1, L, R, x);
	update((u << 1) + 1, l, (l + r >> 1) + 1, L, R, x);
	push_up(u);
	return ;
}
long long query(long long u, long long l, long long r, long long L, long long R) {
	if (in_range(l, r, L, R)) return w[u];
	if (out_range(l, r, L, R)) return 0;
	push_down(u, l, r);
	return query(u << 1, l, l + r >> 1, L, R) + query((u << 1) + 1, (l + r >> 1) + 1, r, L, R);
}
int main() {
	scanf("%lld %lld", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%lld", a + i);
	build(1, 1, n);
	while (m--) {
		scanf("%lld %lld %lld", &op, &x, &y);
		if (op == 1) update_point(1, 1, n, x, y);
		else printf("%lld\n", query(1, 1, n, x, y));
	}
	return 0;
}
2023/11/18 15:33
加载中...