社区讨论
求一个言简意赅【呸】的线段树板子
P3374【模板】树状数组 1参与者 7已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @mi6yk3tu
- 此快照首次捕获于
- 2025/11/20 12:55 4 个月前
- 此快照最后确认于
- 2025/11/20 12:55 4 个月前
本蒟蒻丑陋的线段树。。。
CPP// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N = 500005;
int ans, n, m;
struct Node{
int l, r, val;
}tree[4 * N];
inline int read(){
int f = 0, x = 0; char ch;
do {ch = getchar(); f |= ch == '-';} while (!isdigit(ch));
do {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();} while (isdigit(ch));
return f ? -x : x;
}
inline void build(int l, int r, int k){
tree[k].l = l, tree[k].r = r;
if (tree[k].l == tree[k].r){
tree[k].val = read();
return;
}
int mid = (l + r) >> 1;
build(l, mid, k << 1);
build(mid + 1, r, k << 1 | 1);
tree[k].val = tree[k << 1].val + tree[k << 1 | 1].val;
}
inline int ask(int x, int k){
if (tree[k]. l == tree[k].r){
return tree[k].val;
}
int mid = (tree[k].l + tree[k].r) >> 1;
return x <= mid ? ask(k << 1, x) : ask(k << 1 | 1, x);
}
inline void getsum(int l, int r, int k){
if (l <= tree[k].l && tree[k].r <= r){
ans += tree[k].val;
return;
}
int mid = (tree[k].l + tree[k].r) >> 1;
if (l <= mid)getsum(l, r, k << 1);
if (r > mid)getsum(l, r, k << 1 | 1);
}
inline void updata(int x, int p, int k){
if (tree[k].l == tree[k].r){
tree[k].val += p;
return;
}
int mid = (tree[k].l + tree[k].r) >> 1;
if (x <= mid)updata(x, p, k << 1);
if (x > mid)updata(x, p, k << 1 | 1);
tree[k].val = tree[k << 1].val + tree[k << 1 | 1].val;
}
int main(){
n = read(), m = read();
build(1, n, 1);
for (re int i = 1; i <= m; ++i){
int cz = read();
if (cz == 1){
int x = read(), k = read();
updata(x, k, 1);
}
else{
int x = read(), y = read();
getsum(x, y, 1);
printf("%d\n", ans);
ans = 0;
}
}
return 0;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...