WA 线段树 60 分,求条
查看原帖
WA 线段树 60 分,求条
1313387
wptt楼主2024/3/22 20:55
#include<iostream>
#include<vector>
#define int long long
using namespace std;
const int N=1e6+5,inf=1e18;
int n,m,a[N],s[N<<2],add[N<<2],lazy[N<<2];
void pushdown(int k,int l,int r){
	int mid=(l+r)/2;
	if(lazy[k]!=inf){
		s[k*2]=lazy[k];
		s[k*2+1]=lazy[k];
		
		lazy[k*2]=lazy[k];
		lazy[k*2+1]=lazy[k*2+1];
		
		add[k*2]=add[k*2+1]=0;
	}
	if(add[k]){
		s[k*2]+=add[k];
		s[k*2+1]+=add[k];
		
		add[k*2]+=add[k];
		add[k*2+1]+=add[k];
		
		add[k]=0;
	}
}
void build(int k,int l,int r){
	lazy[k]=inf;
	if(l==r){
		s[k]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	s[k]=max(s[k*2],s[k*2+1]);
}
void change1(int k,int l,int r,int x,int y,int v){
	if(l>y||r<x){
		return;
	}
	if(x<=l&&r<=y){
		s[k]=v;
		add[k]=0;
		lazy[k]=v;
		return;
	}
	pushdown(k,l,r);
	int mid=(l+r)/2;
	change1(k*2,l,mid,x,y,v);
	change1(k*2+1,mid+1,r,x,y,v);
	s[k]=max(s[k*2],s[k*2+1]);
}
void change2(int k,int l,int r,int x,int y,int v){
	if(l>y||r<x){
		return;
	}
	if(x<=l&&r<=y){
		s[k]+=v;
		add[k]+=v;
		return;
	}
	pushdown(k,l,r);
	int mid=(l+r)/2;
	change2(k*2,l,mid,x,y,v);
	change2(k*2+1,mid+1,r,x,y,v);
	s[k]=max(s[k*2],s[k*2+1]);
}
int ask(int k,int l,int r,int x,int y){
	if(l>y||r<x){
		return -inf;
	}
	if(x<=l&&r<=y){
		return s[k];
	}
	pushdown(k,l,r);
	int mid=(l+r)/2;
	return max(ask(k*2,l,mid,x,y),ask(k*2+1,mid+1,r,x,y));
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1,op,l,r,k;i<=m;i++){
		cin>>op>>l>>r;
		if(op==3){
			cout<<ask(1,1,n,l,r)<<'\n';
			continue;
		}
		cin>>k;
		if(op==1){
			change1(1,1,n,l,r,k);
		}
		else{
			change2(1,1,n,l,r,k);
		}
	}
	
	return 0;
}
2024/3/22 20:55
加载中...