大佬求调
查看原帖
大佬求调
1101546
chenxu11楼主2025/1/3 21:33

10pts 求调

#include<bits/stdc++.h>
#define ll long long
#define lc x*2
#define rc x*2+1
using namespace std;
struct node{
	ll l,r,mx,la2,la1;
}t[500005*4];
ll n,q,a[1000005],op,x,y,z;
void build(int x,int l,int r){
	t[x].l=l,t[x].r=r,t[x].mx=-1e18;
	if(l==r){
		t[x].mx=a[l];
		return;
	}
	ll mid=(l+r)/2;
	build(lc,l,mid);
	build(rc,mid+1,r);
	t[x].mx=max(t[lc].mx,t[rc].mx);
}
void down(int x){
    if(t[x].la1){
        t[lc].la2=t[rc].la2=0;
        t[lc].la1=t[rc].la1=t[x].la1;
        t[lc].mx=t[rc].mx=t[x].la1;
        t[x].la1=0;
    }
    if(t[x].la2){
        t[lc].la2+=t[x].la2;
        t[lc].mx+=t[x].la2;
        t[rc].la2+=t[x].la2;
        t[rc].mx+=t[x].la2;
        t[x].la2=0;
    }
}
void cxa(int x,int l,int r,ll k){
	if(t[x].l>=l&&t[x].r<=r){
		t[x].mx+=k;
		t[x].la1+=k;
		return;
	}
	down(x);
	ll mid=(t[x].l+t[x].r)/2;
	if(l<=mid) cxa(lc,l,r,k);
	if(r>mid)  cxa(rc,l,r,k);
	t[x].mx=max(t[lc].mx,t[rc].mx);
}
void tihu(int x,int l,int r,ll k){
	if(t[x].l>=l&&t[x].r<=r){
		t[x].mx=k;
		t[x].la2=k;
		t[x].la1=0;
		return;
	}
	down(x);
	ll mid=(t[x].l+t[x].r)/2;
	if(l<=mid) tihu(lc,l,r,k);
	if(r>mid)  tihu(rc,l,r,k);
	t[x].mx=max(t[lc].mx,t[rc].mx);
}
ll ma(int x,int l,int r){
	ll ans=-1e18;
	if(t[x].l>=l&&t[x].r<=r)
		return t[x].mx;
	down(x);
	ll mid=(t[x].l+t[x].r)/2;
	if(l<=mid) ans=max(ans,ma(lc,l,r));
	if(r>mid)  ans=max(ans,ma(rc,l,r));
	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>>x>>y;
		if(op==1){
		    cin>>z;
			cxa(1,x,y,z);	
		}
		if(op==2){
			cin>>z;
			tihu(1,x,y,z);
		}
		if(op==3)
		    cout<<ma(1,x,y)<<"\n";
	}
	return 0;
} 

悬关

2025/1/3 21:33
加载中...