40qt【玄关】
查看原帖
40qt【玄关】
1293987
zhangruixiang楼主2025/1/15 19:16

code

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define res t[id].lazy=0,t[id].cov=0,t[id].u=false
using namespace std;
const long long _MIN_=-0x7f7f7f7f;
//inline int read(){//fastread
//	int res=0,f=1;
//	char ch=getchar();
//	while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar();}
//	while(isdigit(ch)){ res=res*10+ch-48; ch=getchar();}
//	return res*f;
//}
const int maxn=100000+10;
struct SegmentTree{
	int L,R;
	int lazy,max,cov;
	bool u;
} t[maxn*100];
int n,a[maxn];
void up(int id){
	t[id].max=max(t[id*2].max,t[id*2+1].max);
}
void down(int id){//下传
	if(!(t[id].u)){
		t[id*2].lazy+=t[id].lazy;
		t[id*2+1].lazy+=t[id].lazy;
		
		t[id*2].max+=t[id].lazy;
		t[id*2+1].max+=t[id].lazy;

		res;
	}
	else{
		t[id*2].cov=t[id].cov;
		t[id*2+1].cov=t[id].cov;
		
		t[id*2].lazy=t[id].lazy;
		t[id*2+1].lazy=t[id].lazy;
		
		t[id*2].max=t[id].lazy+t[id].cov;
		t[id*2+1].max=t[id].lazy+t[id].cov;
		
		t[id*2].u=true;
		t[id*2+1].u=true;
		
		res;
	}
	
	
}
void build(int id,int l,int r){//建立
	t[id].L=l; t[id].R=r;
	if(l==r){
		t[id].max=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid); //左子树
	build(id*2+1,mid+1,r);//右子树
	up(id);
}

void update(int id,int l,int r,int val){//将l,r区间同时加上一个val
	if(t[id].L>r || t[id].R<l) return;
	if(t[id].L>=l && t[id].R<=r){//节点自己处理
		t[id].lazy+=val;
		t[id].max+=val;
		return;
	}
	if(t[id].lazy!=0) down(id);
	update(id*2,l,r,val);
	update(id*2+1,l,r,val);
	up(id);
}//修改操作

void change(int id,int l,int r,int val){
	if(l<=t[id].L&&t[id].R<=r){
		t[id].cov=val;
		t[id].lazy=0;
		t[id].max=val;
		return;
	}
	if(t[id].cov!=0) down(id);
	change(id*2,l,r,val);
	change(id*2+1,l,r,val);
	up(id);
	
}//覆盖操作
int ask_max(int id,int l,int r){//查询区间最大值
	if(t[id].L>r || t[id].R<l) return _MIN_;
	if(t[id].L>=l && t[id].R<=r) return t[id].max;
	if(t[id].lazy !=0) down(id);
	return max(ask_max(id*2,l,r),ask_max(id*2+1,l,r));
}
signed main(){
	int m,opt,l,r,val;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--){
		cin>>opt;
		if(opt==1){
			cin>>l>>r>>val;
			change(1,l,r,val);
			
		} 
		else if(opt==2){
			cin>>l>>r>>val;
			update(1,l,r,val);
			
		} 
		else{
			cin>>l>>r;
			cout<<ask_max(1,l,r)<<endl;
		}
	}
	return 0;
}
2025/1/15 19:16
加载中...