0分求调
查看原帖
0分求调
936578
mbzdf楼主2023/11/28 18:47
#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;
}
2023/11/28 18:47
加载中...