只过前四个点,其它TLE求助
查看原帖
只过前四个点,其它TLE求助
711108
tqsw楼主2025/7/30 09:36
#include<iostream>
#include<algorithm>
#define left 2*k
#define right 2*k+1
#define int long long
using namespace std;
int n,q,op,x,y,k,a[1000005],lazy[4000005],lazy2[4000005],mx[4000005];
void build(int k,int l,int r){
	if(l==r){
		mx[k]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(left,l,mid);
	build(right,mid+1,r);
	mx[k]=max(mx[left],mx[right]);
}
void _lazy(int k,int v){
	lazy[k]=v;
	mx[k]=v;
}
void __lazy(int k,int v){
	lazy2[k]+=v;
	mx[k]+=v;
}
void pushdown(int k,int l,int r,int mid){
	if(lazy[k]!=0){
		_lazy(left,lazy[k]);
		_lazy(right,lazy[k]);
		lazy[k]=0;
	}
	if(lazy2[k]!=0){
		__lazy(left,lazy[k]);
		__lazy(right,lazy[k]);
		lazy2[k]=0;
	}
}
void change(int k,int l,int r,int x,int y,int v){
	if(l==r){
		_lazy(k,v);
		return;
	}
	int mid=(l+r)>>1;
	pushdown(k,l,r,mid);
	if(x<=mid)change(left,l,mid,x,y,v);
	if(mid<y)change(right,mid+1,r,x,y,v);
	mx[k]=max(mx[left],mx[right]);
}
void change2(int k,int l,int r,int x,int y,int v){
	if(l==r){
		__lazy(k,v);
		return;
	}
	int mid=(l+r)>>1;
	pushdown(k,l,r,mid);
	if(x<=mid)change2(left,l,mid,x,y,v);
	if(mid<y)change2(right,mid+1,r,x,y,v);
	mx[k]=max(mx[left],mx[right]);
}
int query(int k,int l,int r,int x,int y){
	if(x>r||y<l)return -1e18;
	if(x<=l&&r<=y)return mx[k];
	int mid=(l+r)>>1;
	pushdown(k,l,r,mid);
	return max(query(left,l,mid,x,y),query(right,mid+1,r,x,y));
}
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
inline void write(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
signed main(){
	n=read(),q=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	for(int i=1;i<=q;i++){
		op=read(),x=read(),y=read();
		if(op==1){
			k=read();
			change(1,1,n,x,y,k);
		}
		else if(op==2){
			k=read();
			change2(1,1,n,x,y,k);
		}
		else write(query(1,1,n,x,y)),putchar('\n');
	}
	return 0;
}
2025/7/30 09:36
加载中...