模板1代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, a[N * 4];
struct node {
int l, r, val, lz;
}tr[N * 4];
void build(int id, int l, int r) {
tr[id].l = l, tr[id].r = r;
if (l == r) {
tr[id].val = a[l];
return ;
}
int mid = (l + r) >> 1;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
tr[id].val = tr[id * 2].val + tr[id * 2 + 1].val;
}
void push_down(int id) {
tr[id * 2].lz += tr[id].lz;
tr[id * 2 + 1].lz += tr[id].lz;
tr[id * 2].val += (tr[id * 2].r - tr[id * 2].l + 1) * tr[id].lz;
tr[id * 2 + 1].val += (tr[id * 2 + 1].r - tr[id * 2 + 1].l + 1) * tr[id].lz;
tr[id].lz = 0;
}
void upd(int id, int l, int r, int k) {
if (l <= tr[id].l && tr[id].r <= r) {
tr[id].lz += k;
tr[id].val += (tr[id].r - tr[id].l + 1) * k;
return ;
}
push_down(id);
if (tr[id * 2].r >= l) upd(id * 2, l, r, k);
if (tr[id * 2 + 1].l <= r) upd(id * 2 + 1, l, r, k);
tr[id].val = tr[id * 2].val + tr[id * 2 + 1].val;
}
int sum(int id, int l, int r) {
if (l <= tr[id].l && tr[id].r <= r) {
return tr[id].val;
}
push_down(id);
int ans = 0;
if (tr[id * 2].r >= l) ans += sum(id * 2, l, r);
if (tr[id * 2 + 1].l <= r) ans += sum(id * 2 + 1, l, r);
return ans;
}
int main() {
int m;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
build(1, 1, n);
while (m--) {
int opt, l, r;
cin >> opt >> l >> r;
if (opt == 1) {
int k;
cin >> k;
upd(1, l, r, k);
}
else {
cout << sum(1, l, r) << '\n';
}
}
return 0;
}
70ptsWA求调