题目
https://www.luogu.com.cn/problem/P3372#submit
思路
代码
#include <iostream>
#include <vector>
#include <cstring>
#define MAXX 200005
using namespace std;
int a[MAXX];
struct node
{
int l, r, tag;
long long sum;
} tree[MAXX * 4];
void build(int l, int r, int i)
{
tree[i].l = l;
tree[i].r = r;
if (l == r)
tree[i].sum = a[l];
else
{
int mid = (l + r) >> 1;
build(l, mid, i * 2);
build(mid + 1, r, i * 2 + 1);
tree[i].sum = tree[i * 2].sum + tree[i * 2 + 1].sum;
}
}
void push_down(int i)
{
if (tree[i].tag)
{
tree[i * 2].tag += tree[i].tag;
tree[i * 2 + 1].tag += tree[i].tag;
tree[i * 2].sum += tree[i].tag * (tree[i * 2].r - tree[i * 2].l + 1);
tree[i * 2 + 1].sum += tree[i].tag * (tree[i * 2 + 1].r - tree[i * 2 + 1].l + 1);
tree[i].tag = 0;
}
}
void update(int i, int left, int right, int k)
{
if (tree[i].l >= left && tree[i].r <= right)
{
tree[i].sum += (tree[i].r - tree[i].l + 1) * k;
tree[i].tag += k;
} else
{
push_down(i);
int mid = (tree[i].r + tree[i].l) >> 1;
if (left <= mid)
update(i * 2, left, right, k);
if (right > mid)
update(i * 2 + 1, left, right, k);
tree[i].sum = tree[i * 2].sum + tree[i * 2 + 1].sum;
}
}
long long get_sum(int i, int l, int r)
{
if (tree[i].l >= l && tree[i].r <= r)
return tree[i].sum;
else if (tree[i].l > r || tree[i].r < l)
return 0;
else
{
push_down(i);
long long ans = 0;
int mid = (tree[i].r + tree[i].l) >> 1;
if (l <= mid)
ans += get_sum(i * 2, l, r);
if (r > mid)
ans += get_sum(i * 2 + 1, l, r);
return ans;
}
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
}
build(1, n, 1); //根节点为1
for (int i = 0; i < m; ++i)
{
int op, left, right, k;
cin >> op >> left >> right;
if (op == 1) //每个数加上k
{
cin >> k;
update(1, left, right, k);
}
else //输出区间和
{
cout << get_sum(1, left, right) << endl;
}
}
return 0;
}