半江紫色半江红
查看原帖
半江紫色半江红
1238483
cqbzzlr楼主2024/7/9 13:18
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e5+5;

ll n,q,a[N],tree[N],tag[N];

ll ls(ll x){return x << 1;}
ll rs(ll x){return x << 1 | 1;}

void build(ll l,ll r,ll x)
{
	if(l == r)
	{
		tree[x] = a[l];
		return ;
	}
	ll mid = l + ((r - l) >> 1);
	build(l,mid,ls(x));
	build(mid + 1,r,rs(x));
	tree[x] = tree[ls(x)] + tree[rs(x)];
}

void update(ll l,ll r,ll c,ll s,ll t,ll x)
{
	if(l <= s && t <= r)
	{
		tree[x] += (t - s + 1) * c;
		tag[x] += c;
		return ;
	}
	ll mid = s + ((t - s) >> 1);
	if(tag[x])
	{
		tree[ls(x)] += tag[x] * (mid - s + 1);
		tree[rs(x)] += tag[x] * (t - mid);
		tag[ls(x)] += tag[x];
		tag[rs(x)] += tag[x];
	}
	tag[x] = 0;
	if(l <= mid)
	{
		update(l,r,c,s,mid,ls(x));
	}
	if(r > mid)
	{
		update(l,r,c,mid+1,t,rs(x));
	}
	tree[x] = tree[ls(x)] + tree[rs(x)];
}

ll query(int l,int r,int s,int t,int x)
{
	cout << l << " " << r << " " << s << " " << t << " " << x << endl;
	if(l <= s && t <= r)
	{
		return tree[x];
	}
	ll mid = s + ((t - s) >> 1);
	if(tag[x])
	{
		tree[ls(x)] += tag[x] * (mid - s + 1);
		tree[rs(x)] += tag[x] * (t - mid);
		tag[ls(x)] += tag[x];
		tag[rs(x)] += tag[x];
	}
	tag[x] = 0;
	ll sum = 0;
	if(l <= mid) sum += query(l,r,s,mid,ls(x));
	if(r > mid) sum += query(l,r,mid + 1,t,rs(x));
	return sum;
}

int main()
{
	cin >> n >> q;
	for(int i = 1;i <= n;i++) cin >> a[i];
	build(1,n,1);
	for(int i = 1;i <= q;i++)
	{
		int opr;
		cin >> opr;
		if(opr == 1)
		{
			int x,y,z;
			cin >> x >> y >> z;
			update(x,y,z,1,n,1);
		}
		else
		{
			int x,y;
			cin >> x >> y;
			cout << query(x,y,1,n,1) << endl;
		}
	}
}
2024/7/9 13:18
加载中...