From 25dd0f1a08f85c3cf729fa3bc0a450494dedc883 Mon Sep 17 00:00:00 2001 From: hanyixuanten <105723997+hanyixuanten@users.noreply.github.com> Date: Wed, 26 Aug 2026 21:15:10 +0800 Subject: [PATCH] new file: P3372.cpp --- P3372.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 P3372.cpp diff --git a/P3372.cpp b/P3372.cpp new file mode 100644 index 0000000..b992c66 --- /dev/null +++ b/P3372.cpp @@ -0,0 +1,84 @@ +#include +#define int long long +using namespace std; +struct node +{ + int l, r, num; + int lt; +} seg[400005]; +int a[100005]; +void init(int now, int l, int r) +{ + seg[now].l = l, seg[now].r = r; + if (l == r) + { + seg[now].num = a[l]; + return; + } + int mid = l + r >> 1; + init(now * 2, l, mid); + init(now * 2 + 1, mid + 1, r); + seg[now].num = seg[now * 2].num + seg[now * 2 + 1].num; +} +void pd(int now) +{ + int lt = seg[now].lt; + seg[now * 2].num += lt * (seg[now * 2].r - seg[now * 2].l + 1), seg[now * 2].lt += lt; + seg[now * 2 + 1].num += lt * (seg[now * 2 + 1].r - seg[now * 2 + 1].l + 1), seg[now * 2 + 1].lt += lt; + seg[now].lt = 0; +} +void add(int now, int l, int r, int num) +{ + if (seg[now].r <= r && seg[now].l >= l) + { + seg[now].num += num * (seg[now].r - seg[now].l + 1), seg[now].lt += num; + return; + } + if (seg[now].r < l || seg[now].l > r) + { + return; + } + pd(now); + add(now * 2, l, r, num); + add(now * 2 + 1, l, r, num); + seg[now].num = seg[now * 2].num + seg[now * 2 + 1].num; +} +int query(int now, int l, int r) +{ + if (seg[now].l >= l && seg[now].r <= r) + { + return seg[now].num; + } + if (seg[now].r < l || seg[now].l > r) + { + return 0; + } + pd(now); + return query(now * 2, l, r) + query(now * 2 + 1, l, r); +} +int n, q; +signed main() +{ + scanf("%lld%lld", &n, &q); + for (int i = 1; i <= n; ++i) + scanf("%lld", &a[i]); + init(1, 1, n); + while (q--) + { + int op; + scanf("%lld", &op); + if (op == 1) + { + int l, r, k; + scanf("%lld%lld%lld", &l, &r, &k); + add(1, l, r, k); + } + else + { + int l, r; + scanf("%lld%lld", &l, &r); + printf("%lld\n", query(1, l, r)); + } + } + return 0; +} \ No newline at end of file