初始数组
int Sum[Maxn * 4];
int a[Maxn];
int Add[Maxn * 4];
单点更新
1 - 线段树的建立
void Build(int l, int r, int rt){
if(l == r){
Sum[rt] = a[l];
return;
}
int m = (l + r) >> 1;
Build(l, m, rt << 1);
Build(m + 1, r, rt << 1 | 1);
Sum[rt] = Sum[rt << 1] + Sum[rt << 1 | 1];
}
2 - 单点更新
void Update(int L int C, int l, int r, int rt){
if(l == r && l == L){
Sum[rt] += C;
return;
}
int m = (l + r) >> 1;
if(L <= m)Update(L, R, C, l, m, rt << 1);
else if(L > m)Update(L, R, C, m + 1, r, rt << 1 | 1);
Sum[rt] = Sum[rt << 1] + Sum[rt << 1 | 1];
}
3 - 求区间和
int Query(int L, int R, int l, int r, int rt){
if(L <= l && r <= R){
return Sum[rt];
}
int m = (l + r) >> 1;
int ans = 0;
if(L <= m)ans += Query(L, R, l, m, rt << 1);
if(R > m)ans += Query(L, R, m + 1, r, rt << 1 | 1);
return ans;
}
4 - 主函数
int main(){
Build(l, r, rt);
Update(L, C, l, r, rt);
Query(L, R, l, r, rt);
return 0;
}
区间更新
1 - 建立
void Build(int l, int r, int rt){
if(l == r){
Sum[rt] = a[l];
return;
}
int m = (l + r) >> 1;
Build(l, m, rt << 1);
Build(m + 1, r, rt << 1 | 1);
Sum[rt] = Sum[rt << 1] + Sum[rt << 1 | 1];
}
2 - lazy
void PushDown(int ln, int rn, int rt){
if(Add[rt]){
Add[rt << 1] += Add[rt];
Add[rt << 1 | 1] += Add[rt];
Sum[rt << 1] += Add[rt] * ln;
Sum[rt << 1 | 1] += Add[rt]*rn;
Add[rt] = 0;
}
}
3 - 区间更新
void Update(int L, int R, int C, int l, int r, int rt){
if(L <= l && r <= R){
Sum[rt] += C * (r - l + 1);
Add[rt] += C;
return;
}
int m = (l + r) >> 1;
PushDown(m - l + 1, r - m, rt);
if(L <= m)Update(L, R, C, l, m, rt << 1);
if(R > m)Update(L, R, C, m + 1, r, rt << 1 | 1);
Sum[rt] = Sum[rt << 1] + Sum[rt << 1 | 1];
}
4 - 区间求和
int Query(int L, int R, int l, int r, int rt){
if(L <= l && r <= R){
return Sum[rt];
}
int m = (l + r) >> 1;
int ans = 0;
PushDown(m - l + 1, r - m, rt);
if(L <= m)ans += Query(L, R, l, m, rt << 1);
if(R > m)ans += Query(L, R, m + 1, r, rt << 1 | 1);
return ans;
}
5 - 主函数
int main(){
Build(l, r, rt);
Update(L, R, C, l, r, rt);
Query(L, R, l, r, rt);
return 0;
}