50分求大佬条
查看原帖
50分求大佬条
555262
DNWdpl楼主2024/11/20 18:52
#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=1e6+5;
const int MAXN=1e9+5;
struct node{
	int max,l,r,lzsum,lzcover;
}tree[4*N];
int a[N];

void build_tree(int p,int l,int r){
	tree[p].l=l,tree[p].r=r;
	tree[p].lzcover=MAXN;
	if(l==r){
		tree[p].max=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build_tree(p*2,l,mid);
	build_tree(p*2+1,mid+1,r);
	tree[p].max=max(tree[p*2].max,tree[p*2+1].max);
}

void push_downsum(int p){
	if(tree[p].lzsum!=0){
		tree[p*2].max+=tree[p].lzsum;
		tree[p*2+1].max+=tree[p].lzsum;
		tree[p*2].lzsum+=tree[p].lzsum;
		tree[p*2+1].lzsum+=tree[p].lzsum;
		tree[p].lzsum=0;
	}
}

void push_downcover(int p){
	if(tree[p].lzcover!=MAXN){
		tree[p*2].max=tree[p].lzcover;
		tree[p*2+1].max=tree[p].lzcover;
		tree[p*2].lzcover=tree[p].lzcover;
		tree[p*2+1].lzcover=tree[p].lzcover;
		tree[p].lzcover=0;
	}
}

void coverchange(int p,int l,int r,int z){
	if(tree[p].l>=l&&tree[p].r<=r){
		tree[p].max=z;
		tree[p].lzcover=z;
		return ;
	}
	push_downcover(p);
	if(tree[p*2].r>=l) coverchange(p*2,l,r,z);
	if(tree[p*2+1].l<=r) coverchange(p*2+1,l,r,z);
	tree[p].max=max(tree[p*2].max,tree[p*2+1].max);
}

void sumchange(int p,int l,int r,int z){
	if(tree[p].l>=l&&tree[p].r<=r){
		tree[p].max+=z;
		tree[p].lzsum+=z;
		return ;
	}
	push_downsum(p);
	if(tree[p*2].r>=l) sumchange(p*2,l,r,z);
	if(tree[p*2+1].l<=r) sumchange(p*2+1,l,r,z);
	tree[p].max=max(tree[p*2].max,tree[p*2+1].max);
}
int ask(int p,int l,int r){
	if(tree[p].l>=l&&tree[p].r<=r){
		return tree[p].max;
	}
	push_downcover(p);
	push_downsum(p);
	int ans=0;
	if(tree[p*2].r>=l) ans=max(ask(p*2,l,r),ans);
	if(tree[p*2+1].l<=r) ans=max(ask(p*2+1,l,r),ans);
	return ans;
}
signed main(){
	//freopen("p1253_6.in","r",stdin);
	//freopen("p12536.out","w",stdout);
	int n,m;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build_tree(1,1,n);
	while(m--){
		int qwe,l,r,k;
		scanf("%lld",&qwe);
		if(qwe==1){
			scanf("%lld%lld%lld",&l,&r,&k);
			coverchange(1,l,r,k);
		}else if(qwe==2){
			scanf("%lld%lld%lld",&l,&r,&k);
			sumchange(1,l,r,k);
		}else{
			scanf("%lld%lld",&l,&r);
			cout<<ask(1,l,r)<<endl;
		}
	} 
	return 0;
}
2024/11/20 18:52
加载中...