蒟蒻刚学oi,线段树40求调。
查看原帖
蒟蒻刚学oi,线段树40求调。
631599
Chicken_Rrog楼主2022/10/27 18:49
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[1000005],op,x,y,k;
struct tree{
	long long l,r,mx,lz1,lz2;
}t[4000005];
inline void build(long long i,long long l,long long r){
	t[i].l=l,t[i].r=r;
	if(l==r){
		t[i].mx=a[l];
		return;
	}
	long long mid=(l+r)>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	t[i].mx=max(t[i<<1].mx,t[i<<1|1].mx);
	return;
}
inline void push_down(long long i){
	if(t[i].lz1){
	    t[i<<1].lz2=0;
		t[i<<1|1].lz2=0;
		t[i<<1].lz1=t[i].lz1;
		t[i<<1|1].lz1=t[i].lz1;
		t[i<<1].mx=t[i].lz1;
		t[i<<1|1].mx=t[i].lz1;
		t[i].lz1=0;
	}else{
		t[i<<1].lz2+=t[i].lz2;
		t[i<<1|1].lz2+=t[i].lz2;
		t[i<<1].mx+=t[i].lz2;
		t[i<<1|1].mx+=t[i].lz2;
		t[i].lz2=0;
	}
	return;
}
inline void add1(long long i,long long l,long long r,long long k){
	if(t[i].l>=l&&t[i].r<=r){
		t[i].mx=k;
		t[i].lz1=k;
		t[i].lz2=0;
		return;
	}
	push_down(i);
	if(t[i<<1].r>=l) add1(i<<1,l,r,k);
	if(t[i<<1|1].l<=r) add1(i<<1|1,l,r,k);
	t[i].mx=max(t[i<<1].mx,t[i<<1|1].mx);
	return;
}
inline void add2(long long i,long long l,long long r,long long k){
	if(t[i].l>=l&&t[i].r<=r){
		t[i].mx+=k;
		if(t[i].lz1!=0) t[i].lz1+=k;
		else t[i].lz2+=k;
		return;
	}
	push_down(i);
	if(t[i<<1].r>=l) add2(i<<1,l,r,k);
	if(t[i<<1|1].l<=r) add2(i<<1|1,l,r,k);
	t[i].mx=max(t[i<<1].mx,t[i<<1|1].mx);
	return;
}
inline long long search(long long i,long long l,long long r){
	if(t[i].l>=l&&t[i].r<=r) return t[i].mx;
	push_down(i);
	long long num=-1;
	if(t[i<<1].r>=l) num=search(i<<1,l,r);
	if(t[i<<1|1].l<=r) num=max(num,search(i<<1|1,l,r));
	return num;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--){
		scanf("%lld%lld%lld",&op,&x,&y);
		if(op==1){
			scanf("%lld",&k);
			add1(1,x,y,k);
		}else if(op==2){
			scanf("%lld",&k);
			add2(1,x,y,k);
		}else{
			printf("%lld\n",search(1,x,y));
		}
	}
	return 0;
}
2022/10/27 18:49
加载中...