样例未过,求调
查看原帖
样例未过,求调
561529
Infinite_Energy楼主2022/7/15 16:42
#include<bits/stdc++.h>
using namespace std;
long long n,q,a[500010],op,x,y,k,ans;
struct tree{
	long long l,r,tag1,tag2,minn,maxx;
}t[2000010];
long long read(){
	char ch=getchar();long long sgn=1,x=0;
	while(ch<'0'||ch>'9'){
		if(ch=='-'){sgn=-1;}ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch&15);ch=getchar();
	}
	return x*sgn;
}
void build(long long i,long long l,long long r){
	t[i].l=l;t[i].r=r;
	t[i].tag1=0;t[i].tag2=0;
	if(l==r){
		t[i].maxx=a[l];t[i].minn=a[l];
		return;
	}
	build(i*2,l,(l+r)/2);
	build(i*2+1,(l+r)/2+1,r);
	t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
	t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
}
void pushdown(long long i){
	if(t[i].tag1==0&&t[i].tag2==0){
		return;
	}
	if(t[i].tag1!=0){
		t[i*2].maxx=t[i].tag1;t[i*2].minn=t[i].tag1;
		t[i*2].tag1=t[i].tag1;t[i*2].tag2=0;
		t[i*2+1].maxx=t[i].tag1;t[i*2+1].minn=t[i].tag1;
		t[i*2+1].tag1=t[i].tag1;t[i*2+1].tag2=0;
		t[i].tag1=0;
	} 
	if(t[i].tag2!=0){
		t[i*2].maxx+=t[i].tag2;t[i*2].minn+=t[i].tag2;
		t[i*2].tag1+=t[i].tag2;t[i*2].tag2+=t[i].tag2;
		t[i*2+1].maxx+=t[i].tag2;t[i*2+1].minn+=t[i].tag2;
		t[i*2+1].tag1+=t[i].tag2;t[i*2+1].tag2+=t[i].tag2;
		t[i].tag2=0;
	}
}
void step1(long long i){
	if(x<=t[i].r&&y>=t[i].l){
		if(x<=t[i].l&&y>=t[i].r){
			t[i].tag2+=k;t[i].maxx+=k;t[i].minn+=k; 
			return;
		}
		pushdown(i);
		step1(i*2);
		step1(i*2+1);
		t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
		t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
	}
}
void step2(long long i){
	if(x<=t[i].r&&y>=t[i].l){
		if(x<=t[i].l&&y>=t[i].r){
			t[i].tag1=k;t[i].maxx=k;t[i].minn=k;t[i].tag2=0;
			return;
		}
		pushdown(i);
		step2(i*2);
		step2(i*2+1);
		t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
		t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
	}
}
void step3(long long i){
	if(x<=t[i].r&&y>=t[i].l){
		if(x<=t[i].l&&y>=t[i].r){
			t[i].tag1=k;t[i].maxx=k;t[i].minn=k;t[i].tag2=0;
			return;
		}
		pushdown(i);
		step3(i*2);
		step3(i*2+1);
		t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
		t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
	}
}
void step4(long long i){
	if(x<=t[i].r&&y>=t[i].l){
		if(x<=t[i].l&&y>=t[i].r){
			t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
			t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
			ans=max(ans,t[i].maxx);
			return;
		}
		pushdown(i);
		step4(i*2);
		step4(i*2+1);
		t[i].maxx=max(t[i*2].maxx,t[i*2+1].maxx);
		t[i].minn=min(t[i*2].minn,t[i*2+1].minn);
		ans=max(ans,t[i].maxx);
	}
}
int main(){
	n=read();q=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,1,n);
	while(q--){
		op=read();
		if(op==1){
			x=read();y=read();k=read();
			step1(1);
		}
		if(op==2){
			x=read();y=read();k=read();
			step2(1);
		}
		if(op==3){
			x=read();y=read();k=read();
			step3(1);
		}
		if(op==4){
			x=read();y=read();
			ans=-9999999999;
			step4(1);
			printf("%lld\n",ans);
		}
	}
	return 0;
}

输出:7 7 8

2022/7/15 16:42
加载中...