0分求调orz
查看原帖
0分求调orz
312027
Shigongcheng001楼主2023/11/25 17:22
#include<bits/stdc++.h>
using  namespace std;
#define N 1000005
#define ll long long
#define ls o*2
#define rs o*2+1

ll n,m,x,y,k,flag;
ll a[N];

struct tree{
	ll l,r;//左,右子节点 
	ll point;//节点值 
	ll add;//懒标记值 
};
tree t[4*N];

 void build(ll o,ll l,ll r){
 	t[o].l =ls;
	t[o].r =rs;
 	if(l==r){
 		t[o].point=a[l];
 		return;
	 }
	 ll mid=l+r>>1;
	 build(ls,l,mid);
	 build(rs,mid+1,r);
	 t[o].point =t[ls].point +t[rs].point ;//更新节点值 
 }

 void spread(ll o){
 	if(t[o].add ){
 		t[ls].point +=t[o].add *(t[ls].r-t[ls].l +1);
 		t[rs].point +=t[o].add *(t[rs].r-t[rs].l+1);
 		t[ls].add +=t[o].add ;
 		t[rs].add +=t[o].add ;
 		t[o].add =0;
	 }
 }
 
 void change(ll o,ll x,ll y,ll z){
 	if(x<=t[o].l &&y>t[o].r ){
 	  t[o].add +=z;
 	  t[o].point +=z*(t[o].r -t[o].l +1);
 	  return ;
	}
	spread(o);
	ll mid=t[o].l +t[o].r >>1;
	if(x<=mid)change(mid,x,y,z);
	if(y>mid)change(mid+1,x,y,z);
	t[o].point =t[ls].point +t[rs].point ;//更新节点值 
 	
 }

 ll ask(ll o,ll x,ll y){
 	if(x<=t[o].l &&y>t[o].r ){
 		return t[o].point ;
	 }
 	ll ans=0;
 	ll mid=t[o].l +t[o].r >>1;	
 	if(x<=mid) ans+=ask(mid,x,y);
 	if(y>mid) ans+=ask(mid+1,x,y);//查到的完全包含的节点的返回 
 	
 	return ans;//查到的不完全包含的节点的返回  
 }


int main(){
cin>>n>>m;
for(ll i=1;i<=n;i++){
	cin>>a[i];
}
build(1,1,n);	
	for(ll i=1;i<=m;i++){
		cin>>flag;
		if(flag==1){
			cin>>x>>y>>k;
			change(1,x,y,k);
		}
		if(flag==2){
			cin>>x>>y;
			cout<<ask(1,x,y)<<endl;
		}
	}
	
	return 0;
}
2023/11/25 17:22
加载中...