社区讨论

70pts球条

P1253扶苏的问题参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mjso87rp
此快照首次捕获于
2025/12/30 22:17
2 个月前
此快照最后确认于
2026/01/02 20:25
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5,nailong=4e9+7;
#define mid ((l+r)>>1)
int n,q;
struct Tree{
	int maxx,lazy1,lazy2;
}tree[4*N];
int a[N];
int ls(int x){return x*2;}
int rs(int x){return x*2+1;}
void pushup(int x){
	tree[x].maxx=max(tree[ls(x)].maxx,tree[rs(x)].maxx);
	return;
}
void build(int l,int r,int x){
	if(l==r){
		tree[x].maxx=a[l];
		tree[x].lazy2=0;
		return;
	}
	tree[x].lazy1=nailong;
	tree[x].lazy2=0;
	build(l,mid,ls(x));
	build(mid+1,r,rs(x));
	pushup(x);
	return;
}
void pushdown(int x){
	if(tree[x].lazy1!=nailong){
		tree[ls(x)].maxx=tree[x].lazy1;
		tree[rs(x)].maxx=tree[x].lazy1;
		tree[ls(x)].lazy1=tree[x].lazy1;
		tree[rs(x)].lazy1=tree[x].lazy1;
		tree[ls(x)].lazy2=0;
		tree[rs(x)].lazy2=0;
		tree[x].lazy1=nailong;
	}
	if(tree[x].lazy2){
		tree[ls(x)].maxx+=tree[x].lazy2;
		tree[rs(x)].maxx+=tree[x].lazy2;
		tree[ls(x)].lazy2+=tree[x].lazy2;
		tree[rs(x)].lazy2+=tree[x].lazy2;
		tree[x].lazy2=0;
	}
	return;
}
void update1(int l,int r,int x,int L,int R,int k){
	if(L<=l&&r<=R){
		tree[x].maxx=k;
		tree[x].lazy1=k;
		tree[x].lazy2=0;
		return;
	}
	pushdown(x);
	if(L<=mid)update1(l,mid,ls(x),L,R,k);
	if(R>=mid+1)update1(mid+1,r,rs(x),L,R,k);
	pushup(x);
	return;
}
void update2(int l,int r,int x,int L,int R,int k){
	if(L<=l&&r<=R){
		tree[x].maxx+=k;
		tree[x].lazy2+=k;
		return;
	}
	pushdown(x);
	if(L<=mid)update2(l,mid,ls(x),L,R,k);
	if(R>=mid+1)update2(mid+1,r,rs(x),L,R,k);  
	pushup(x);
	return;
}
int query(int l,int r,int x,int L,int R){
	if(L<=l&&r<=R){
		return tree[x].maxx;
	}
	pushdown(x);
	int res=-nailong;
	if(L<=mid)res=query(l,mid,ls(x),L,R);
	if(R>=mid+1)res=max(res,query(mid+1,r,rs(x),L,R));
	return res;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	while(q--){
		int l,r,x,op;
		cin>>op;
		if(op==1){
			cin>>l>>r>>x;
			update1(1,n,1,l,r,x);
		}else if(op==2){
			cin>>l>>r>>x;
			update2(1,n,1,l,r,x);
		}else{
			cin>>l>>r;
			cout<<query(1,n,1,l,r)<<'\n';
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...