#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define LCHILD(p) (((p) << 1) | 1)
#define RCHILD(P) (((p) + 1) << 1)
using namespace std;
void solve() {
int n, k;
cin >> n >> k;
vector<int> data(n);
for (int i = 0; i < n; i++) {
cin >> data[i];
}
struct node {
int field;
int lazy;
};
vector<struct node> st(4 * n);
auto pushdown = [&](int p, int left, int right) -> void {
if (st[p].lazy == 0)
return;
int mid = (left + right) >> 1;
st[LCHILD(p)].field += st[p].lazy * (mid - left + 1);
st[LCHILD(p)].lazy += st[p].lazy;
st[RCHILD(p)].field += st[p].lazy * (right - mid);
st[RCHILD(p)].lazy += st[p].lazy;
st[p].lazy = 0;
};
auto pushup = [&](int p) -> void {
st[p].field = st[LCHILD(p)].field + st[RCHILD(p)].field;
};
auto build = [&](auto&& build, int p, int left, int right) -> void {
st[p].lazy = 0;
if (left == right) {
st[p].field = data[left];
return;
}
int mid = (left + right) >> 1;
build(build, LCHILD(p), left, mid);
build(build, RCHILD(p), mid + 1, right);
pushup(p);
};
auto query = [&](auto&& query, int p, int left, int right, int qleft,
int qright) -> int {
if (left > qright || right < qleft)
return 0;
if (left >= qleft && right <= qright)
return st[p].field;
int mid = (left + right) >> 1;
pushdown(p, left, right);
int q1 = query(query, LCHILD(p), left, mid, qleft, qright);
int q2 = query(query, RCHILD(p), mid + 1, right, qleft, qright);
return q1 + q2;
};
auto update = [&](auto&& update, int p, int left, int right, int qleft,
int qright, int val) -> void {
if (qleft > right || left > qright)
return;
if (left >= qleft && right <= qright) {
st[p].field += val * (right - left + 1);
st[p].lazy += val;
return;
}
int mid = (left + right) >> 1;
pushdown(p, left, right);
update(update, LCHILD(p), left, mid, qleft, qright, val);
update(update, RCHILD(p), mid + 1, right, qleft, qright, val);
pushup(p);
};
build(build, 0, 0, n - 1);
for (int i = 0; i < k; i++) {
int l, r, v;
cin >> l >> r >> v;
update(update, 0, 0, n - 1, l - 1, r - 1, v);
}
for(int i=0;i<n;i++)
{
cout<<query(query,0,0,n-1,i,i)<<' ';
}
}
signed main() {
int t = 1;
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
while (t--) {
solve();
}
return 0;
}
此题是道差分的板子题,但我搞不明白差分的原理,用线段树写了一下,需要注意是区间更新时要加上懒标记,防止复杂度退化,于是这道题就成了线段树的板子题

京公网安备 11010502036488号