0分求助
查看原帖
0分求助
894429
syq2022楼主2023/10/23 11:14
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct stree{
 ll l,r;
 ll num;
 ll lazy;
};
stree tr[100005*4];
ll a[100005];
void pushup(ll u)
{
	tr[u].num=tr[u*2].num+tr[u*2+1].num;
}
void build(ll u,ll l,ll r)
{
	tr[u].l=l;
	tr[u].r=r;
	if(l==r)
	{
		tr[u].num=a[l];
		return;
	}
	ll mid=(l+r)/2;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	pushup(u);
} 
void pushdown(ll u)
{
	tr[u*2].lazy=tr[u].lazy;
	tr[u*2+1].lazy=tr[u].lazy;
	tr[u*2].num+=(tr[u*2].r-tr[u*2].l+1)*tr[u].lazy;
	tr[u*2+1].num+=(tr[u*2+1].r-tr[u*2+1].l+1)*tr[u+1].lazy;		
}
int xw(ll u,ll L,ll R)
{
	if(tr[u].l>=L&&tr[u].r<=R)
	{
		return tr[u].num;
	}
	ll mid=(tr[u].l+tr[u].r)/2;
	ll res=0;
	pushdown(u);
	if(mid>=L) res+=xw(u*2,L,R);
	if(mid<R) res+=xw(u*2+1,L,R);
	return res; 
}
void md(ll u,ll L,ll R,ll x)
{
	if(tr[u].l>=L&&tr[u].r<=R)
	{
		tr[u].lazy+=x;
		tr[u].num+=(tr[u].r-tr[u].l+1)*x;
		return;
	}
	ll mid=(tr[u].l+tr[u].r)/2;
	
	if(mid>=L) md(u*2,L,R,x);
	if(mid<R) md(u*2+1,L,R,x);
	pushup(u);
}
int main()
{
	ll n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	ll opt,x,y,k;
	while(m--)
	{
		cin>>opt;
		if(opt==1)
		{
			cin>>x>>y>>k;
			md(1,x,y,k);
		}
		else{
			cin>>x>>y;
			cout<<xw(1,x,y)<<endl;
		}
	}
	
}

萌新第一次打线段树,就爆0了

2023/10/23 11:14
加载中...