线段树10pts求调
查看原帖
线段树10pts求调
347621
_Sushi楼主2022/7/21 20:50

rt

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
ll p,x,y,k;
struct node{
	ll l,r;
	ll sum;
	ll lazy;
}a[300000];
ll xx[300000];
ll build(ll l,ll r,ll k)
{
	a[k].l=l,a[k].r=r;
	if(l==r)
	{
		a[k].sum=xx[l];
		return xx[l];
	}
	ll mid=(l+r)>>1;
	a[k].sum+=build(l,mid,k*2);
	a[k].sum+=build(mid+1,r,k*2+1);
	return a[k].sum;
}
ll add(ll l,ll r,ll x,ll k)
{
	if(l==a[k].l&&r==a[k].r)
	{
		a[k].lazy+=x;
		return (r-l+1)*x;
	}
	ll mid=(a[k].l+a[k].r)>>1;
	if(mid>=r)
	{
		ll s=add(l,r,x,k*2);
		a[k].sum+=s;
		return s;
	}
	if(l>mid)
	{
		ll s=add(l,r,x,k*2+1);
		a[k].sum+=s;
		return s;
	}
	ll sa=add(l,mid,x,k*2),sb=add(mid+1,r,x,k*2+1);
	a[k].sum+=(sa+sb);
	return sa+sb;
}
ll sum(ll l,ll r,ll k,ll la)
{
	a[k].sum+=(a[k].r-a[k].l+1)*(la+a[k].lazy);
	la+=a[k].lazy,a[k].lazy=0;

	if(l==a[k].l&&r==a[k].r) return a[k].sum;
	ll mid=(a[k].l+a[k].r)>>1;
	if(mid>=r)
		return sum(l,r,k*2,la);
	if(l>mid)
		return sum(l,r,k*2+1,la);
	return sum(l,mid,k*2,la)+sum(mid+1,r,k*2+1,la);
}
int main()
{
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=n;i++) scanf("%lld",&xx[i]);
    build(1,n,1);
    for(ll i=1;i<=m;i++)
    {
    	scanf("%lld",&p);
    	if(p==1)
    	{
    		scanf("%lld%lld%lld",&x,&y,&k);
    		add(x,y,k,1);
		}
		else
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",sum(x,y,1,0));
		}
	}
	return 0;
}
2022/7/21 20:50
加载中...