- 树状数组1:单点修改,区间查询
SegmentTree
- @ 2026-2-9 10:00:01
struct SegmentTree {
int n;
vector<ll> t;
SegmentTree(int n_, const vector<int> &init) {
n = n_;
t.assign(n * 4 + 1, 0);
build(1, 1, n, init);
}
void push_up(int u) {
t[u] = t[u * 2] + t[u * 2 + 1];
}
void build(int u, int ul, int ur, const vector<int> &init) {
if (ul == ur) {
t[u] = init[ul];
return;
}
int mid = ul + ur >> 1;
build(u * 2, ul, mid, init);
build(u * 2 + 1, mid + 1, ur, init);
push_up(u);
}
ll query(int u, int ul, int ur, int l, int r) {
if (l <= ul && ur <= r) return t[u];
if (ur < l || r < ul) return 0;
int mid = ul + ur >> 1;
return query(u * 2, ul, mid, l, r) + query(u * 2 + 1, mid + 1, ur, l, r);
}
ll query(int l, int r) {
return query(1, 1, n, l, r);
}
void change(int u, int ul, int ur, int x, ll y) {
if (ul == ur) {
t[u] += y;
return;
}
int mid = ul + ur >> 1;
if (x <= mid) change(u * 2, ul, mid, x, y);
else change(u * 2 + 1, mid + 1, ur, x, y);
push_up(u);
}
void change(int x, ll y) {
change(1, 1, n, x, y);
}
};
void solve() {
int n, m;
cin >> n >> m;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
SegmentTree t(n, a);
while (m--) {
ll o, x, y;
cin >> o >> x >> y;
if (o == 1) t.change(x, y);
else cout << t.query(x, y) << '\n';
}
}
0 条评论
目前还没有评论...
信息
- ID
- 429
- 时间
- ms
- 内存
- MiB
- 难度
- 3
- 标签
- 递交数
- 53
- 已通过
- 15
- 上传者