- 树状数组 3 :区间修改,区间查询
题解
- 2024-5-30 21:59:29 @
#include<iostream>
#include<cstdio>
#include<algorithm>
#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;
}
0 条评论
目前还没有评论...
信息
- ID
- 2609
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 240
- 已通过
- 34
- 上传者