先放一个模板吧
#include<iostream>
#include<cstdio>
#include<algorithm>
#define mid ((l + r) >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1
#define tag tree[rt].lazy
using namespace std;
typedef long long ll;
const int N = 4e5 + 10;
struct Tree {
int l, r;
ll value, lazy;
}tree[N];
void push_down(int rt) {
if(tag) {
tree[ls].value += tag * (tree[ls].r - tree[ls].l + 1);
tree[rs].value += tag * (tree[rs].r - tree[rs].l + 1);
tree[ls].lazy += tag;
tree[rs].lazy += tag;
tag = 0;
}
}
void build(int rt, int l, int r) {
tree[rt].l = l;
tree[rt].r = r;
tree[rt].lazy = 0;
if(l == r) {
scanf("%lld", &tree[rt].value);
return ;
}
build(lson);
build(rson);
tree[rt].value = tree[ls].value + tree[rs].value;
}
ll Query(int rt, int l, int r, int L, int R) {//区间查找。
if(l >= L && r <= R)
return tree[rt].value;
push_down(rt);
ll a = 0, b = 0;
if(L <= mid) a = Query(lson, L, R);
if(R > mid) b = Query(rson, L, R);
return a + b;
}
ll Query(int rt, int l, int r, int dis) {//单点查找。
return Query(rt, l, r, dis, dis);
}
void Update(int rt, int l, int r, int L, int R, ll k) {//区间跟新。
if(l >= L && r <= R) {
tree[rt].value += k * (tree[rt].r - tree[rt].l + 1);
tree[rt].lazy += k;
return ;
}
push_down(rt);
if(L <= mid) Update(lson, L, R, k);
if(R > mid) Update(rson, L, R, k);
tree[rt].value = tree[ls].value + tree[rs].value;
}
void Update(int rt, int l, int r, int dis, ll k) {//单点跟新。
Update(rt, l, r, dis, dis, k);
}
void print(int rt, int l, int r) {//输出所有的叶子的值。
if(l == r) {
printf("%lld ", tree[rt].value);
return ;
}
print(lson);
print(rson);
}
int main() {
return 0;
}