- 树状数组 3 :区间修改,区间查询
TJ
- 2024-2-3 8:58:31 @
/* created by chjshen, date: 2024-02-03 08:36 */
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define ls (fa << 1)
#define rs (fa << 1 | 1)
const int N = 1E6 + 6;
int n, q, a[N];
struct SegmentTree
{
int l, r, add, sum;
} t[N * 4];
void pushUp(int fa)
{
t[fa].sum = t[ls].sum + t[rs].sum;
}
void build(int fa, int L, int R)
{
t[fa].l = L, t[fa].r = R;
if (L == R)
{
t[fa].sum = a[R];
return;
}
int mid = (L + R) >> 1;
build(ls, L, mid);
build(rs, mid + 1, R);
pushUp(fa);
}
void pushDown(int fa)
{
if (t[fa].add == 0) return;
int c = t[fa].add;
t[ls].add += c;
t[ls].sum += c * (t[ls].r - t[ls].l + 1);
t[rs].add += c;
t[rs].sum += c * (t[rs].r - t[rs].l + 1);
t[fa].add = 0;
}
void update(int fa, int l, int r, int c)
{
if (l <= t[fa].l && t[fa].r <= r)
{
t[fa].add += c;
t[fa].sum += c * (t[fa].r - t[fa].l + 1);
return;
}
pushDown(fa);
int mid = (t[fa].l + t[fa].r) >> 1;
if (l <= mid) update(ls, l, r, c);
if (mid < r) update(rs, l, r, c);
pushUp(fa);
}
int query(int fa, int l, int r)
{
if (l <= t[fa].l && t[fa].r <= r)
{
return t[fa].sum;
}
int mid = (t[fa].l + t[fa].r) >> 1;
pushDown(fa);
int ans = 0;
if (l <= mid) ans += query(ls, l, r);
if (mid < r) ans += query(rs, l, r);
return ans;
}
void handle(void)
{
while (q--)
{
int op, l, r, c;
scanf("%lld%lld%lld", &op, &l, &r);
if (op == 1)
{
scanf("%lld", &c);
update(1, l, r, c);
}
else
printf("%lld\n", query(1, l, r));
}
}
void initInput(void)
{
scanf("%lld%lld", &n, &q);
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
build(1, 1, n);
}
signed main(void)
{
initInput();
handle();
return 0;
}
4 条评论
-
曹栩榛 LV 8 @ 2024-2-3 8:59:53
qhp
-
2024-2-3 8:59:37@
zp
-
2024-2-3 8:58:58@
hp
-
2024-2-3 8:58:39@
qp
- 1
信息
- ID
- 2609
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 144
- 已通过
- 23
- 上传者