mbzdf @ 2023-11-28 18:47:58
#include <iostream>
#include <cstdio>
using namespace std;
struct node
{
int l, r;
long long v;
long long lazy = 0;
}d[400005];
int n, m;
long long int a[400005];
void mt(int p, int l, int r)
{
d[p].l = l, d[p].r = r;
if(l == r)
{
d[p].v = a[l];
return;
}
int mid = (l + r) >> 1;
mt(p << 1, l, mid), mt(p << 1 | 1, mid + 1, r);
d[p].v = d[p << 1].v + d[p << 1 | 1].v;
return;
}
long long query(int p, int l, int r){
if(l <= d[p].l && d[p].r <= r) return d[p].v;
if(d[p].lazy){
d[p << 1].v += d[p].lazy * (d[p << 1].r - d[p << 1].l + 1);
d[p << 1 | 1].v += d[p].lazy * (d[p << 1 | 1].r - d[p << 1 | 1].l + 1);
d[p << 1].lazy += d[p].lazy;
d[p << 1 | 1].lazy += d[p].lazy;
d[p].lazy = 0;
}
int mid = (d[p].l + d[p].r) >> 1;
long long int ans = 0;
if(l <= mid) ans += query(p << 1, l, r);
if(mid < r) ans += query(p << 1 | 1, l, r);
return ans;
}
void at(int p, int l, int r, int x)
{
if(l <= d[p].l && d[p].r <= r)
{
d[p].lazy += (long long) x *(d[p].r - d[p].l + 1);
d[p].v += x;
return;
}
if(d[p].lazy){
d[p << 1].v += d[p].lazy * (d[p << 1].r - d[p << 1].l + 1);
d[p << 1 | 1].v += d[p].lazy * (d[p << 1 | 1].r - d[p << 1 | 1].l + 1);
d[p << 1].lazy += d[p].lazy;
d[p << 1 | 1].lazy += d[p].lazy;
d[p].lazy = 0;
}
int mid = (d[p].l + d[p].r) >> 1;
if(l <= mid) at(p << 1, l, r, x);
if(mid < r) at(p << 1 | 1, l, r, x);
d[p].v = d[p << 1].v + d[p << 1 | 1].v;
return;
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; ++i) cin >> a[i];
mt(1, 1, n);
while(m--)
{
int op;
cin >> op;
if(op == 1)
{
int l, r, x;
cin >> l >> r>> x;
at(1, l, r, x);
}
else
{
int l, r;
cin >> l >> r;
cout << query(1, l, r) << endl;
}
}
return 0;
}
by 0907_WDS_0731 @ 2023-11-28 19:00:28
#include <iostream>
#include <cstdio>
using namespace std;
struct node
{
int l, r;
long long v;
long long lazy = 0;
}d[400005];
int n, m;
long long int a[400005];
void mt(int p, int l, int r)
{
d[p].l = l, d[p].r = r;
if(l == r)
{
d[p].v = a[l];
return;
}
int mid = (l + r) >> 1;
mt(p << 1, l, mid), mt(p << 1 | 1, mid + 1, r);
d[p].v = d[p << 1].v + d[p << 1 | 1].v;
// return;
}
long long query(int p, int l, int r){
if(l <= d[p].l && d[p].r <= r) return d[p].v;
if(d[p].lazy){
d[p << 1].v += d[p].lazy * (d[p << 1].r - d[p << 1].l + 1);
d[p << 1 | 1].v += d[p].lazy * (d[p << 1 | 1].r - d[p << 1 | 1].l + 1);
d[p << 1].lazy += d[p].lazy;
d[p << 1 | 1].lazy += d[p].lazy;
d[p].lazy = 0;
}
int mid = (d[p].l + d[p].r) >> 1;
long long int ans = 0;
if(l <= mid) ans += query(p << 1, l, r);
if(mid < r) ans += query(p << 1 | 1, l, r);
return ans;
}
void at(int p, int l, int r, int x)
{
if(l <= d[p].l && d[p].r <= r)
{
// d[p].lazy += (long long) x *(d[p].r - d[p].l + 1);
// d[p].v += x;
d[p].v += (long long) x *(d[p].r - d[p].l + 1);
d[p].lazy += x;
return;
}
if(d[p].lazy){
d[p << 1].v += d[p].lazy * (d[p << 1].r - d[p << 1].l + 1);
d[p << 1 | 1].v += d[p].lazy * (d[p << 1 | 1].r - d[p << 1 | 1].l + 1);
d[p << 1].lazy += d[p].lazy;
d[p << 1 | 1].lazy += d[p].lazy;
d[p].lazy = 0;
}
int mid = (d[p].l + d[p].r) >> 1;
if(l <= mid) at(p << 1, l, r, x);
if(mid < r) at(p << 1 | 1, l, r, x);
d[p].v = d[p << 1].v + d[p << 1 | 1].v;
return;
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; ++i) cin >> a[i];
mt(1, 1, n);
while(m--)
{
int op;
cin >> op;
if(op == 1)
{
int l, r, x;
cin >> l >> r>> x;
at(1, l, r, x);
}
else
{
int l, r;
cin >> l >> r;
cout << query(1, l, r) << endl;
}
}
return 0;
}
在第44-45行处,该下标的懒标记应该加上传过来的懒标记x,该位置的值应该加上懒标记的和(at函数