线段树板子求调
查看原帖
线段树板子求调
212423
FrozenDream楼主2022/9/28 20:07
#include<bits/stdc++.h>
using namespace std;
#define ls(x) ((x)*2)
#define rs(x) ((x)*2+1)
#define mid ((l+r)/2)
int n,q,p,x,y,k,w[100005];
struct seg {
	int t[400005],lazy[400005],ans[400005];
	void f(int x,int l,int r,int k) {
		lazy[x]+=k;
		ans[x]+=k*(r-l+1);
	}
	void push_up(int x) {
		t[x]=t[ls(x)]+t[rs(x)];
	}
	void push_down(int x,int l,int r) {
		f(ls(x),l,mid,lazy[x]);
		f(rs(x),mid+1,r,lazy[x]);
		lazy[x]=0;
	}
	void build(int x,int l,int r) {
		if(l==r) {
			t[x]=w[l];
			return;
		}
		build(ls(x),l,mid);
		build(rs(x),mid+1,r);
		push_up(x);
	}
	void update(int x,int l,int r,int L,int R,int k) {
		if(l>=L&&r<=R) {
			ans[x]+=k*(r-l+1);
			lazy[x]+=k;
			return;
		}
		push_down(x,l,r);
		if(L<=mid)update(ls(x),l,mid,L,R,k);
		if(R>mid)update(rs(x),mid+1,r,L,R,k);
		push_up(x);
	}
	int query(int x,int l,int r,int L,int R) {
		if(l>=L&&r<=R) {
			return ans[x];
		}
		int sum=0;
		push_down(x,l,r);
		if(L<=mid)sum+=query(ls(x),l,mid,L,R);
		if(R>mid)sum+=query(rs(x),mid+1,r,L,R);
		return sum;
	}
} a;
int main() {
	cin>>n>>q;
	for(int i=1; i<=n; i++) {
		cin>>w[i];
	}
	a.build(1,1,n);
	while(q--) {
		cin>>p;
		if(p==1) {
			cin>>x>>y>>k;
			a.update(1,1,n,x,y,k);
		} else {
			cin>>x>>y;
			cout<<a.query(1,1,n,x,y)<<endl;
		}
	}
}
2022/9/28 20:07
加载中...