线段树求条!40分!
查看原帖
线段树求条!40分!
909957
LITFLYR楼主2024/7/29 09:53

最后一个点为什么会T啊要破防了QAQ

#include<bits/stdc++.h>
using namespace std;
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
int n,q,a[1000005];
int op,x,y,k;
int tre[4000005],lazy_add[4000005],lazy_cha[4000005];
void push_up(int f){
	tre[f]=max(tre[ls(f)],tre[rs(f)]);
}
void build(int f,int l,int r){
	if(l==r){
		tre[f]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls(f),l,mid);
	build(rs(f),mid+1,r);
	push_up(f);
}
void push_down(int f,int l,int r){
	if(lazy_cha[ls(f)]==0) lazy_add[ls(f)]+=lazy_add[f];
	else lazy_cha[ls(f)]+=lazy_add[f];
	if(lazy_cha[rs(f)]==0) lazy_add[rs(f)]+=lazy_add[f];
	else lazy_cha[rs(f)]+=lazy_add[f];
	if(lazy_cha[f]!=0){
		lazy_cha[rs(f)]=lazy_cha[f];
		lazy_cha[ls(f)]=lazy_cha[f];
		lazy_add[rs(f)]=0;
		lazy_add[ls(f)]=0;
	}
	int mid=(l+r)>>1;
	if(lazy_cha[f]==0){
		tre[ls(f)]+=lazy_add[f];
		tre[rs(f)]+=lazy_add[f];
	} 
	else{
		tre[ls(f)]=lazy_cha[f];
		tre[rs(f)]=lazy_cha[f];
	}
	lazy_add[f]=lazy_cha[f]=0;
}
void cha(int f,int l,int r,int x,int y,int k){
	push_down(f,l,r);
	if(x<=l&&r<=y){
		tre[f]=k;
		lazy_cha[f]=k;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid) cha(ls(f),l,mid,x,y,k);
	if(y>mid) cha(rs(f),mid+1,r,x,y,k);
	push_up(f);
}
void add(int f,int l,int r,int x,int y,int k){
	push_down(f,l,r);
	if(x<=l&&r<=y){
		tre[f]+=k;
		lazy_add[f]+=k;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid) add(ls(f),l,mid,x,y,k);
	if(y>mid) add(rs(f),mid+1,r,x,y,k);
	push_up(f);
}
int query(int f,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		return tre[f];
	}
	push_down(f,l,r);
	int mid=(l+r)>>1,ans=0;
	if(x<=mid) ans=max(ans,query(ls(f),l,mid,x,y));
	if(y>mid) ans=max(ans,query(rs(f),mid+1,r,x,y));
	return ans;
}
int main(){
	cin >> n >> q;
	for(int i=1;i<=n;i++) cin >> a[i];
	build(1,1,n);
	while(q--){
		cin >> op;
		if(op==1){
			cin >> x >> y >> k;
			cha(1,1,n,x,y,k);
		}
		else if(op==2){
			cin >> x >> y >> k;
			add(1,1,n,x,y,k);
		}
		else{
			cin >> x >> y;
			cout << query(1,1,n,x,y) << endl;
		}
	}
}
2024/7/29 09:53
加载中...