20 分线段树求助
查看原帖
20 分线段树求助
229366
Fast_IO楼主2022/4/15 17:21

RT

#include<iostream>
using namespace std;
#define int long long
const int INF = 0x3f3f3f3f;
const int N = 1e6+5;
struct Node{int l,r,v,lazy_tag1,lazy_tag2;}tr[4*N];
int a[N],q,n;
inline void pushup(int p){
	tr[p].v=max(tr[p*2].v,tr[p*2+1].v);
}
inline void bulid(int p,int l,int r){
	int mid=l+r>>1;
	tr[p].l=l;
	tr[p].r=r;
	if(l==r){
		tr[p].v=a[l];
		return ;
	}
	bulid(p*2,l,mid);
	bulid(p*2+1,mid+1,r);
	pushup(p);
} 
inline void pushdown(int p){
	tr[p*2].lazy_tag1+=tr[p].lazy_tag1,tr[p*2].v+=tr[p].lazy_tag1; 
	tr[p*2+1].lazy_tag1+=tr[p].lazy_tag1,tr[p*2+1].v+=tr[p].lazy_tag1; 
	tr[p].lazy_tag1=0;
	if(tr[p].lazy_tag2!=INF){
		tr[p*2].v=tr[p*2].lazy_tag2=tr[p].lazy_tag2,tr[p*2].lazy_tag1=0;
		tr[p*2+1].v=tr[p*2+1].lazy_tag2=tr[p].lazy_tag2,tr[p*2+1].lazy_tag1=0;
		tr[p].lazy_tag2=INF;
	}
}
inline int query(int p,int ql,int qr){
	if(ql<=tr[p].l && qr>=tr[p].r) return tr[p].v;
	int mid=tr[p].l+tr[p].r>>1;
	pushdown(p);
	if(qr<=mid) return query(p*2,ql,qr);
	else if(ql>mid) return query(p*2+1,ql,qr);
	else return max(query(p*2,ql,qr),query(p*2+1,ql,qr));
}
inline void update(int p,int ul,int ur,int d){
	if(ul<=tr[p].l && ur>=tr[p].r){
		tr[p].lazy_tag1+=d;
		tr[p].v+=d;
		return ;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(ur<=mid){
		update(p*2,ul,ur,d);
		tr[p].v=max(tr[2*p].v,tr[2*p+1].v);
	}else if(ul>mid){
		update(p*2+1,ul,ur,d);
		tr[p].v=max(tr[2*p].v,tr[2*p+1].v);
	}else{
		update(p*2,ul,ur,d);
		update(p*2+1,ul,ur,d);
		tr[p].v=max(tr[2*p].v,tr[2*p+1].v);
	}
	pushup(p);
}
inline void update2(int p,int ul,int ur,int d){
	if(ul<=tr[p].l && ur>=tr[p].r){
		tr[p].v=tr[p].lazy_tag2=d;
		tr[p].lazy_tag1=0;
		return ;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(ur<=mid){
		update2(p*2,ul,ur,d);
		tr[p].v=max(tr[2*p].v,tr[2*p+1].v);
	}else if(ul>mid){
		update2(p*2+1,ul,ur,d);
		tr[p].v=max(tr[2*p].v,tr[2*p+1].v);
	}else{
		update2(p*2,ul,ur,d);
		update2(p*2+1,ul,ur,d);
		tr[p].v=max(tr[2*p].v,tr[2*p+1].v);
	}
	pushup(p);
}
signed main(){
	ios::sync_with_stdio(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	bulid(1,1,n);
	while(q--){
		int op,l,r,x;
		cin>>op>>l>>r;
		if(op==3) cout<<query(1,l,r)<<endl;
		else if(op==2){
			cin>>x;
			update(1,l,r,x);
		}else{
			cin>>x;
			update2(1,l,r,x);
		}
	} 
	return 0;
}
2022/4/15 17:21
加载中...