#include <iostream>
#define int long long
#define endl "\n"
const int N = 1000010;
using namespace std;
int n, q;
int a[N];
struct node
{
int sum;
int l, r;
int lz;
}tree[N * 4];
void build (int k, int l, int r)
{
tree[k].l = l;
tree[k].r = r;
tree[k].lz = 0;
if (l == r)
{
tree[k].sum = a[l];
return ;
}
int mid = (l + r) >> 1;
build (k << 1, l, mid) , build (k << 1 | 1, mid + 1, r);
tree[k].sum = tree[k << 1].sum + tree[k << 1 | 1].sum;
}
void lazy (int k, int v)
{
tree[k].sum += (tree[k].r - tree[k].l + 1) * v;
tree[k].lz += v;
}
void pushdown (int k)
{
lazy (k << 1, tree[k].lz);
lazy (k << 1 | 1, tree[k].lz);
tree[k].lz = 0;
}
void modify (int k, int x, int y, int v)
{
int l = tree[k].l , r = tree[k].r;
if (l >= x && r <= y) return lazy (k, v);
if (tree[k].lz != 0) pushdown (k);
int mid = (l + r) >> 1;
if (x <= mid) modify (k << 1, x, y, v);
if (y > mid) modify (k << 1 | 1, x, y, v);
tree[k].sum = tree[k << 1].sum + tree[k << 1 | 1].sum;
}
int query (int x, int y, int k)
{
int l = tree[k].l , r = tree[k].r;
if (l >= x && r <= y) return tree[k].sum;
if (tree[k].lz != 0) pushdown (k);
int mid = (l + r) >> 1;
int ans = 0;
if (x <= mid) ans += query (x, y, k << 1);
if (y > mid) ans += query (x, y, k << 1 | 1);
return ans;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i ++) cin >> a[i];
build (1, 1, n);
while (q --)
{
int opt , l, r;
cin >> opt >> l >> r;
if (opt == 1)
{
int x;
cin >> x;
modify (1, l, r, x);
}
else
{
cout << query (l, r, 1) << endl;
}
}
}
[模板] 线段树(单点修改)
于 2023-04-07 21:51:10 首次发布