没过样例求助

P1253 扶苏的问题

Anonymely @ 2022-07-03 09:06:07

#include<bits/stdc++.h>
using namespace std;

#define int long long
const int N=200005;
const int inf=1e18;

int n,m;
int a[N];
struct tree{
    int l,r;
    int sum;
    int tag1=inf,tag2;
}t[N<<2];

int lson(int p){return p<<1;}
int rson(int p){return (p<<1)|1;}
int md(int l,int r){return (l+r)>>1;}
void pushup(int p){
    t[p].sum=max(t[lson(p)].sum,t[rson(p)].sum);
}

void make_tag1(int p,int k){
    t[p].sum=k;
    t[p].tag1=k;
    t[p].tag2=0;
}

void make_tag2(int p,int k){
    t[p].sum+=k;
    if(t[p].tag1!=inf)t[p].tag1+=k;
    else t[p].tag2+=k;
}

void pushdown(int p){
    if(t[p].tag1!=inf){
        make_tag1(lson(p),t[p].tag1);
        make_tag1(rson(p),t[p].tag1); 
        t[p].tag1=inf;
    }else if(t[p].tag2){
        make_tag2(lson(p),t[p].tag2);
        make_tag2(rson(p),t[p].tag2);
        t[p].tag2=0;    
    }
}

void build(int p,int l,int r){
    t[p].l=l,t[p].r=r;
    if(l==r){
        t[p].sum=a[l];return ;
    }
    int mid=md(l,r);
    build(lson(p),l,mid);
    build(rson(p),mid+1,r);
    pushup(p);
}

void update(int p,int l,int r,int op,int k){
    if(l<=t[p].l&&t[p].r<=r){
        if(op==1)make_tag1(p,k);
        else make_tag2(p,k);
        return ;
    }
    int mid=md(t[p].l,t[p].r);
    pushdown(p);
    if(l<=mid)update(lson(p),l,r,op,k);
    if(r>mid)update(rson(p),l,r,op,k);
    pushup(p);
}

int query(int p,int l,int r){
    if(l<=t[p].l&&t[p].r<=r){
        return t[p].sum;
    }
    pushdown(p);
    int ans=-inf;
    int mid=md(t[p].l,t[p].r);
    if(l<=mid)ans=max(ans,query(lson(p),l,r));
    if(r>mid)ans=max(ans,query(rson(p),l,r));
    return ans;
}

signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int op,l,r;cin>>op>>l>>r;
        if(op==1){
            int x;cin>>x;
            update(1,l,r,x,1);
        }else if(op==2){
            int x;cin>>x;
            update(1,l,r,x,2);
        }else{
            cout<<query(1,l,r)<<endl;
        }
    }
    return 0;
}

麻了,没过样例


|