线段树

struct tree{
	int l,r,w,tage;
}t[N];
void push_up(int u) {
	t[u].w=t[u*2].w+t[u*2+1].w;
}
void push_down(int u) {
	t[u*2].w+=(t[u*2].r-t[u*2].l+1)*t[u].tage;
	t[u*2+1].w+=(t[u*2+1].r-t[u*2+1].l+1)*t[u].tage;
	t[u*2].tage+=t[u].tage;
	t[u*2+1].tage+=t[u].tage;
	t[u].tage=0;
}
void build(int u,int l,int r) {
	t[u].l=l;t[u].r=r;
	if (l==r) {
		t[u].w=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	push_up(u);
}
void update(int u,int l,int r,int v) {
	if (t[u].l>=l&&t[u].r<=r) {
		t[u].w+=(t[u].r-t[u].l+1)*v;
		t[u].tage+=v;
		return;
	}
	push_down(u);
	int mid=(t[u].l+t[u].r)/2;
	if (l<=mid) update(u*2,l,r,v);
	if (r>mid) update(u*2+1,l,r,v);
	push_up(u);
}
int query(int u,int l,int r) {
	if (t[u].l>=l&&t[u].r<=r) {
		return t[u].w;
	}
	push_down(u);
	int ans=0;
	int mid=(t[u].l+t[u].r)/2;
	if (l<=mid) ans+=query(u*2,l,r);
	if (r>mid) ans+=query(u*2+1,l,r);
	return ans;
}
int n,m;
int a[N];
int main() {
	cin>>n>>m;
	for (int i=1;i<=n;++i) {
		cin>>a[i];
	}
	build(1,1,n);
	while (m--) {
		int opt;
		cin>>opt;
		if (opt==1) {
			int x,y,k;
			cin>>x>>y>>k;
			update(1,x,y,k);
		}
		else {
			int x,y;
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
}
posted @ 2025-11-30 21:41  Pwtking  阅读(13)  评论(0)    收藏  举报