请看一下,第一个样例过不了,悬关,谢谢
查看原帖
请看一下,第一个样例过不了,悬关,谢谢
913178
CLX_brunch楼主2024/7/29 19:28
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,a[5000010],x,y,z,www,b[5000010],q[5000010],d[5000010];
void push1(ll x){
	if(b[x]){
		d[x*2]+=b[x];
	    d[x*2+1]+=b[x];
	    b[x*2]+=b[x];
	    b[x*2+1]+=b[x];
	    b[x]=0;
	} 
} 
void push2(ll x){
	if(q[x]!=LONG_LONG_MAX){
	    d[x*2]=d[x*2+1]=q[x];
	    q[x*2]=q[x*2+1]=q[x];
	    b[x*2]=b[x*2+1]=0;
	    q[x]=LONG_LONG_MAX;
    }
}
void build(ll s,ll t,ll p){
	if(s==t){
		d[p]=a[s];
		return ;
	} 
    ll m=(t-s)/2+s;
    build(s,m,p*2);
    build(m+1,t,p*2+1);
    d[p]=max(d[p*2],d[p*2+1]);
    return ;
}

void change1(ll l,ll r,ll c,ll s,ll t,ll p){
	if(l<=s&&r>=t){
	    d[p]+=c;
	    b[p]+=c;
	    return ;
    }
    push2(p);
    push1(p);
    ll m=(t-s)/2+s;
    if(l<=m) change1(l,r,c,s,m,p*2);
    if(r>m) change1(l,r,c,m+1,t,p*2+1);
    d[p]=max(d[p*2],d[p*2+1]);
}
void change2(ll l,ll r,ll c,ll s,ll t,ll p){
	if(l<=s&&r>=t){
	    d[p]=q[p]=c;
	    b[p]=0;
	    return ;
    }
    ll m=(t-s)/2+s; 
    push2(p);
    push1(p);
    if(l<=m) change2(l,r,c,s,m,p*2);
    if(r>m) change2(l,r,c,m+1,t,p*2+1);
    d[p]=max(d[p*2],d[p*2+1]);
}
ll getmax(ll l,ll r,ll s,ll t,ll p){
    if(l<=s&&r>=t){
	    return d[p];
    }
    ll m=(t-s)/2+s,sum=LONG_LONG_MIN;
    push2(p);
    push1(p);
    if(l<=m) sum=max(sum,getmax(l,r,s,m,p*2));
    if(r>m) sum=max(sum,getmax(l,r,m+1,t,p*2+1));
    return sum;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,n,1);
    for(int i=1;i<=m;i++){
	    cin>>www;
	    if(www==1){
	        cin>>x>>y>>z;
	        change2(x,y,z,1,n,1);
        }
        if(www==2){
	        cin>>x>>y>>z;
	        change1(x,y,z,1,n,1);
        }
        if(www==3){
	        cin>>x>>y;
	        cout<<getmax(x,y,1,n,1)<<endl;
	    }
    }
    return 0;
}
2024/7/29 19:28
加载中...