20分,AC#1#3
查看原帖
20分,AC#1#3
1127126
yueyan_WZF楼主2024/8/21 20:36
#include<bits/stdc++.h>
using namespace std;
struct node{
	int l,r,lazy2,lazy1,maxx;
	long long sum;
}z[5000003];
long long a[1000020];
int n,q;
void updata(int k){
	z[k].sum=z[k*2].sum+z[k*2+1].sum;
	z[k].maxx=max(z[k*2].maxx,z[k*2+1].maxx);
}
void pushdown(int k){	
	if(z[k].lazy2){
		z[k*2].sum+=1ll*(z[k*2].r-z[k*2].l+1)*z[k].lazy2;
		z[k*2+1].sum+=1ll*(z[k*2].r-z[k*2].l+1)*z[k].lazy2;
		z[k*2].maxx+=z[k].lazy2;
		z[k*2+1].maxx+=z[k].lazy2;
		z[k*2].lazy2+=z[k].lazy2;
		z[k*2+1].lazy2+=z[k].lazy2;
		z[k].lazy2=0;
	}
	if(z[k].lazy1!=-0x3f3f3f3f){
		//z[k].sum=(z[k].r-z[k].l+1)*k;
		z[k*2].sum=1ll*(z[k*2].r-z[k*2].l+1)*z[k].lazy1;
		z[k*2+1].sum=1ll*(z[k*2+1].r-z[k*2+1].l+1)*z[k].lazy1;
		z[k*2].maxx=z[k*2+1].maxx=z[k].lazy1;
		z[k*2].lazy1=z[k].lazy1;
		z[k*2+1].lazy1=z[k].lazy1;
		z[k].lazy1=-0x3f3f3f3f;
	}
	
}
void build(int l,int r,int k){
	z[k].l=l;
	z[k].r=r;
	z[k].lazy2=0;
	z[k].lazy1=-0x3f3f3f3f;
	z[k].maxx=-0x3f3f3f3f3f;
	if(l==r){
		z[k].sum=a[l];
		z[k].maxx=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(l,mid,k*2);
	build(mid+1,r,k*2+1);
	updata(k);
}
void chan1(int l,int r,int k,int a){
	if(z[k].l>=l&&z[k].r<=r){
		z[k].sum=1ll*(z[k].r-z[k].l+1)*a;
		z[k].maxx=a;
		z[k].lazy1=a;
		return ;
	}
	pushdown(k);
	int mid=(z[k].l+z[k].r)>>1;
	if(l<=mid){
		chan1(l,r,k*2,a);
	}
	if(r>mid){
		chan1(l,r,k*2+1,a);
	}
	updata(k);
}
void chan2(int l,int r,int k,int a){
	if(z[k].l>=l&&z[k].r<=r){
		z[k].sum+=1ll*(z[k].r-z[k].l+1)*a;
		z[k].maxx+=a;
		z[k].lazy2+=a;
		return ;
	}
	pushdown(k);
	int mid=(z[k].l+z[k].r)>>1;
	if(l<=mid){
		chan2(l,r,k*2,a);
	}
	if(r>mid){
		chan2(l,r,k*2+1,a);
	}
	updata(k);
}
int find(int l,int r,int k){
	if(z[k].l>=l&&z[k].r<=r){
		return z[k].maxx;
	}
	pushdown(k);
	int mid=(z[k].r+z[k].l)>>1;
	int maxx;
	if(l<=mid){
		maxx=find(l,r,k*2);
		//	cout<<maxx<<" "<<z[k*2].l<<" "<<z[k*2].r<<endl;
	}
	if(r>mid){
		maxx=max(maxx,find(l,r,k*2+1));
		//	cout<<maxx<<" "<<z[k*2+1].l<<" "<<z[k*2+1].r<<endl;
	}
	//cout<<maxx<<endl;
	return maxx;
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,n,1);
	while(q--){
		int opt;
		scanf("%d",&opt);
		if(opt==1){
			int l,r;
			int x;
			scanf("%d%d%d",&l,&r,&x);
			chan1(l,r,1,x);
		}
		if(opt==2){
			int l,r;
			int x;
			scanf("%d%d%d",&l,&r,&x);
			chan2(l,r,1,x);
		}
		if(opt==3){
			int l,r,x;
			scanf("%d%d",&l,&r);
			printf("%d\n",find(l,r,1));
		}
	}
}
2024/8/21 20:36
加载中...