线段树求条(return value 3221225725)
查看原帖
线段树求条(return value 3221225725)
1373205
dg114514楼主2024/12/12 17:34

rt,蒟蒻是全谷最水红

#include<bits/stdc++.h>
#define y1 qysghfjdsdfuifdgyu
using namespace std;
struct segTree{
	#define l(x) ((x)<<1)
	#define r(x) ((x)<<1|1)
	struct node{
		int ma,mi,sum,sumtag;
		node(int a=0,int b=0,int c=0):ma(a),mi(b),sum(c){}
	}tr[200005];
	int n;
	inline void pushup(int p){
		tr[p].ma=max(tr[l(p)].ma,tr[r(p)].ma);
		tr[p].mi=min(tr[l(p)].mi,tr[r(p)].mi);
		tr[p].sum=tr[l(p)].sum+tr[l(p)].sum;
	}
	inline void pushdown(int p,int l,int r){
		int mid=l+r>>1;
		tr[l(p)].sumtag+=tr[p].sumtag;
		tr[r(p)].sumtag+=tr[p].sumtag;
		tr[l(p)].sum+=(mid-l+1)*tr[p].sumtag;
		tr[r(p)].sum+=(r-mid)*tr[p].sumtag;
		tr[p].sumtag=0;
	}
	void build(int R,int l,int r,int* a){
		if(l==r)tr[R]={a[l],a[l],a[l]};
		else{
			int mid=l+r>>1;
			build(l(R),l,mid,a);
			build(r(R),mid+1,r,a);
			pushup(R);
		}
	}
	void update(int R,int ul,int ur,int l,int r,int val){
		if(ul<=l&&ur>=r) tr[R].sumtag+=val,tr[R].sum+=(r-l+1)*val; 
		else{
			int mid=l+r>>1;
			pushdown(R,l,r);
			update(l(R),ul,ur,l,mid,val);
			update(r(R),ul,ur,mid+1,r,val);
		}
	}
	node query(int R,int ql,int qr,int l,int r){
		node ans={0,0,0},t;
		if(ql<=l&&ql>=r)return tr[R];
		int mid=l+r>>1;
		if(ql<=mid){
			t=query(l(R),ql,qr,l,mid);
			ans={max(ans.ma,t.ma),min(ans.mi,t.mi),ans.sum+t.sum};
		}
		if(qr>mid){
			t=query(r(R),ql,qr,mid+1,r);
			ans={max(ans.ma,t.ma),min(ans.mi,t.mi),ans.sum+t.sum};
		}
		return ans;
	}
	inline void build(int _n,int* a){build(1,1,_n,a),n=_n;}
	inline void update(int l,int r,int val){update(1,l,r,1,n,val);}
	inline node query(int l,int r){return query(1,l,r,1,n);}
	#undef l
	#undef r
};
segTree t;
int a[100005];
int main(){
	int n,q,op,l,r,x;
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	t.build(n,a);
	while(q--){
		cin>>op>>l>>r;
		if(op==1)cin>>x,t.update(l,r,x);
		else cout<<t.query(l,r).sum<<"\n";
	}
	
}
2024/12/12 17:34
加载中...