线段树

不带lazy

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll tr[1000000],a[1000000],ans[1000000],lazy[1000000];
void bui(ll id,ll l,ll r){
	if(l==r){
		tr[id]=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	bui(id*2,l,mid);
	bui(id*2+1,mid+1,r);
	tr[id]=tr[id*2]+tr[id*2+1];
}
ll find(ll id,ll l,ll r,ll x,ll y){
	if(l>y||r<x)return 0;
	if(x<=l&&r<=y){
		return tr[id];
	}
	ll mid=(l+r)>>1;
	ll ans=0;
	if(x<=mid){
		ans+=find(id*2,l,mid,x,y);
	}
	if(y>mid){
		ans+=find(id*2+1,mid+1,r,x,y);
	}
	return ans;
}
void gx(ll id,ll l,ll r,ll x,ll y,ll z){
	if(r<x||l>y)return;
	if(l==r){
		tr[id]+=z;
		return;
	}
	ll mid=(l+r)>>1;
	if(x<=mid){
		gx(id*2,l,mid,x,y,z);
	}
	if(y>mid){
		gx(id*2+1,mid+1,r,x,y,z);
	}
	tr[id]=tr[id*2]+tr[id*2+1];
}
int main(){
	ll n,m,x,y,z;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	bui(1,1,n);
	while(m--){
		cin>>x;
		if(x==1){
			cin>>x>>y>>z;
			gx(1,1,n,x,y,z);
//			cout<<tr[1]<<endl;
		}
		else{
			cin>>x>>y;
			cout<<find(1,1,n,x,y)<<endl;
		}
	}
}
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll tr[1000000],a[1000000],ans[1000000],lazy[1000000];
void bui(ll id,ll l,ll r){
	if(l==r){
		tr[id]=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	bui(id*2,l,mid);
	bui(id*2+1,mid+1,r);
	tr[id]=tr[id*2]+tr[id*2+1];
}
void f(ll id,ll l,ll r,ll c){
	lazy[id]+=c;
	tr[id]+=(r-l+1)*c;
}
void push_down(ll id,ll l,ll r){
	ll mid=(l+r)>>1;
	f(id*2,l,mid,lazy[id]);
	f(id*2+1,mid+1,r,lazy[id]);
	lazy[id]=0;
}
ll find(ll id,ll l,ll r,ll x,ll y){
	if(l>y||r<x)return 0;
	if(x<=l&&r<=y){
		return tr[id];
	}
	push_down(id,l,r);
	ll mid=(l+r)>>1;
	ll ans=0;
	if(x<=mid){
		ans+=find(id*2,l,mid,x,y);
	}
	if(y>mid){
		ans+=find(id*2+1,mid+1,r,x,y);
	}
	return ans;
}
void gx(ll id,ll l,ll r,ll x,ll y,ll z){
	if(r<x||l>y)return;
	if(x<=l&&r<=y){
		tr[id]+=z*(r-l+1);
		lazy[id]+=z;
		return;
	}
	push_down(id,l,r);
	ll mid=(l+r)>>1;
	if(x<=mid){
		gx(id*2,l,mid,x,y,z);
	}
	if(y>mid){
		gx(id*2+1,mid+1,r,x,y,z);
	}
	tr[id]=tr[id*2]+tr[id*2+1];
}
int main(){
	ll n,m,x,y,z;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	bui(1,1,n);
	while(m--){
		cin>>x;
		if(x==1){
			cin>>x>>y>>z;
			gx(1,1,n,x,y,z);
		}
		else{
			cin>>x>>y;
			cout<<find(1,1,n,x,y)<<endl;
		}
	}
}
posted @   MistyPost  阅读(8)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示