线段树30pts求助
查看原帖
线段树30pts求助
350945
linlioo楼主2022/1/20 09:45
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
	ll l,r,add,mid,sum;
}a[400010];
void pushup(ll num)
{
	a[num].sum=a[num<<1].sum+a[num<<1|1].sum;
}
void csh(ll l,ll r,ll num)
{
	a[num].l=l;
	a[num].r=r;
	if(l==r)
	{
		scanf("%lld",&a[num].sum);
		return ;
	}
	a[num].mid=l+r>>1;
	csh(l,a[num].mid,num<<1);
	csh(a[num].mid+1,r,num<<1|1);
	pushup(num);
}
void sp(ll k)
{
	a[k<<1].add+=a[k].add;
	a[k<<1|1].add+=a[k].add;
	a[k<<1].sum+=(a[k<<1].r-a[k<<1].l+1)*a[k].add;
	a[k<<1|1].sum+=(a[k<<1].r-a[k<<1].l+1)*a[k].add;
	a[k].add=0;
}
void add(ll k,ll l,ll r,ll v)
{
	if(a[k].l>=l&&a[k].r<=r)
	{
		a[k].sum+=(a[k].r-a[k].l+1)*v;
		a[k].add+=v;
		return ;
	}
	sp(k);
	if(l<=a[k].mid) 
	{
		add(k<<1,l,r,v);
	}
	if(r>a[k].mid)
	{
		add(k<<1|1,l,r,v);
	}
	pushup(k);
	
}
ll find(ll k,ll l,ll r)
{
	if(l<=a[k].l&&a[k].r<=r)
	{
		return a[k].sum;
	}
	ll ans=0;
	sp(k);
	if(l<=a[k].mid) ans+=find(k<<1,l,r);
	if(r>a[k].mid) ans+=find(k<<1|1,l,r);
	return ans;
}
int main()
{
//	freopen("4.in","r",stdin);
//	freopen("4.out","w",stdout);
	ll n,m;
	scanf("%lld%lld",&n,&m);
	csh(1,n,1);
	while(m--)
	{
		ll q;
		scanf("%lld",&q);
		if(q==1)
		{
			ll l,r,v;
			scanf("%lld%lld%lld",&l,&r,&v);
			add(1,l,r,v);
		}
		else
		{
			ll l,r;
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",find(1,l,r));
		}
	}
}
2022/1/20 09:45
加载中...