struct tree{
LL sum[MAX_N << 2];
LL add[MAX_N << 2];
void pushup(int k){
sum[k] = sum[k<<1] + sum[k<<1|1];
}
void pushdown(int k, int m){
if(add[k]){
add[k<<1] += add[k];
add[k<<1|1] += add[k];
sum[k<<1] += add[k] * (m - (m/2));
sum[k<<1|1] += add[k] * (m/2);
add[k] = 0;
}
}
void build(int l, int r, int k){
add[k] = 0;
if(l == r) {
scanf("%lld", &sum[k]);
return ;
}
int m = (l + r) / 2;
build(lson);
build(rson);
pushup(k);
}
void update(int L, int R, int x, int l, int r, int k){
if(L <= l && R >= r){
add[k] += x;
sum[k] += (LL)x * (r - l + 1);
return ;
}else{
pushdown(k, r - l + 1);
int m = (l + r) / 2;
if(L <= m ) update(L, R, x, lson);
if(R > m) update(L, R, x, rson);
pushup(k);
}
}
void update(int L, int R, int x){
update(L, R, x, 1, n, 1);
}
LL query(int L, int R, int l, int r, int k){
if(L <= l && R >= r) return sum[k];
else{
LL ans = 0;
pushdown(k, r - l + 1);
int m = (l + r) / 2;
if(L <= m) ans += query(L, R, lson);
if(R > m) ans += query(L, R, rson);
return ans;
}
}
LL query(int L, int R){
return query(L, R, 1, n, 1);
}
}segment;
线段树模板(区间更新)
最新推荐文章于 2018-03-12 20:25:19 发布