初识懒标记。。。
#include<iostream>
#include<cstdio>
using namespace std;
#define LL long long
const int N = 100010;
struct Node{
int l, r;
LL sum;
LL add; // lazy
}tr[N * 4];
int n, m;
LL w[N];
void update(int u, LL w){
int len = tr[u].r - tr[u].l + 1;
tr[u].sum += w * len;
tr[u].add += w;
}
void pushdown(int u){
update(u << 1, tr[u].add);
update(u << 1 | 1, tr[u].add);
tr[u].add = 0;
}
void pushup(int u){
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
void build(int u, int l, int r){
if(l == r) tr[u] = {l, r, w[l]};
else{
tr[u] = {l, r};
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
void modify(int u, int x, LL v){
if(tr[u].l == tr[u].r) tr[u].sum += v;
else{
int mid = tr[u].l + tr[u].r >> 1;
if(x <= mid) modify(u << 1, x, v);
else modify(u << 1 | 1, x, v);
}
}
LL query(int u, int l, int r){
if(l <= tr[u].l && r >= tr[u].r) return tr[u].sum;
if(tr[u].add) pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
LL sum = 0;
if(l <= mid) sum = query(u << 1, l, r);
if(r > mid) sum += query(u << 1 | 1, l, r);
return sum;
}
void change(int u, int l, int r, LL v){
if(tr[u].l == l && tr[u].r == r){
update(u, v);
return;
}
if(tr[u].add) pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if(r <= mid) change(u << 1, l, r, v);
else if(l > mid) change(u << 1 | 1, l, r, v);
else{
change(u << 1, l, mid, v);
change(u << 1 | 1, mid + 1, r, v);
}
pushup(u);
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++) scanf("%lld", &w[i]);
build(1, 1, n);
while(m --){
int k, x, y;
cin >> k >> x >> y;
if(k == 1){
LL v;
cin >> v;
change(1, x, y, v);
}else
cout << query(1, x, y) << endl;
}
return 0;
}
原文:https://www.cnblogs.com/tomori/p/13762574.html