20PTS求调!!!
查看原帖
20PTS求调!!!
685640
_liuyiqin楼主2024/12/9 20:24
#include<bits/stdc++.h>
using namespace std;
const int N(1e6+5);
#define int long long
int n,q;
int a[N];
struct node{
	int l,r,ma=-1e18;
	int tag,val=-1e18;
}t[N<<2];
inline void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].ma=a[l];
		return;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	t[p].ma=max(t[p<<1].ma,t[p<<1|1].ma);
	return ;
}
inline void pushdown_1(int p){
	if(t[p].val!=-1e18){
		t[p<<1].ma=t[p].val,t[p<<1|1].ma=t[p].val; 
		t[p<<1].val=t[p].val,t[p<<1|1].val=t[p].val;
		t[p].val=-1e18,t[p].tag=0; 	
	}
	return ;
}
inline void pushdown_2(int p){
	if(t[p].tag){
		t[p<<1].ma+=t[p].tag,t[p<<1|1].ma+=t[p].tag; 
		t[p<<1].tag+=t[p].tag,t[p<<1|1].tag+=t[p].tag;
		t[p].tag=0; 
	}
	return ;
}
inline void modify_1(int p,int l,int r,int x){
	if(l<=t[p].l&&r>=t[p].r){
		t[p].val=x;
		t[p].ma=x;
		t[p].tag=0;
		return;
	}
	pushdown_1(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) modify_1(p<<1,l,mid,x);
	if(r>mid) modify_1(p<<1|1,mid+1,r,x);
	t[p].ma=max(t[p<<1].ma,t[p<<1|1].ma);
	return;
}
inline void modify_2(int p,int l,int r,int x){
	if(l<=t[p].l&&r>=t[p].r){
		t[p].tag+=x;
		t[p].ma+=x;
		return;
	}
	pushdown_2(p);
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid) modify_2(p<<1,l,mid,x);
	if(r>mid) modify_2(p<<1|1,mid+1,r,x);
	t[p].ma=max(t[p<<1].ma,t[p<<1|1].ma);
	return;
}
inline int query(int p,int l,int r){
	if(l<=t[p].l&&r>=t[p].r) return t[p].ma;
	pushdown_1(p);
	pushdown_2(p); 
	int mid=t[p].l+t[p].r>>1;
	int ans=-2e9;
	if(l<=mid) ans=max(ans,query(p<<1,l,r));
	if(r>mid) ans=max(ans,query(p<<1|1,l,r));
	return ans;
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i]; 
	}
	build(1,1,n);
	while(q--){
		int op,l,r,x;
		cin>>op>>l>>r;
		if(op==1){
			cin>>x;
			modify_1(1,l,r,x);
		}
		else if(op==2){
			cin>>x;
			modify_2(1,l,r,x);
		}
		else if(op==3){
			cout<<query(1,l,r)<<endl;
		}
	}
	return 0;
}
2024/12/9 20:24
加载中...