qaq玄关TLE+WA

P1253 扶苏的问题

so_find_skind @ 2023-07-23 16:52:38

#include<bits/stdc++.h>
using namespace std;
int n,q,a[1000005];
int s[4000005],mark[4000005],mak[4000005],k[4000005];
void build(int p,int l,int r){
    if(l==r){
        cin>>s[p];
        return ;
    }
    build(2*p,l,(l+r)/2);
    build(2*p+1,(l+r)/2+1,r);
    s[p]=max(s[p*2],s[p*2+1]);
}
void down(int p,int l,int r){
    if(!k[p])
        return ;
    if(k[p]==1){
        mark[p*2]=mark[p];
        s[p*2]=mark[p];
        if(!mak[p*2])
            k[p*2]=1;
        mark[2*p+1]=mark[p];
        if(!mak[p*2+1])
            k[p*2+1]=1;
        s[p*2+1]=mark[p];
        mark[p]=0;
        if(mak[p]){
            mak[p*2]+=mak[p];
            s[p*2]+=mak[p]*((l+r)/2-l);
            if(!mark[p*2])
                k[p*2]=2;
            mak[p*2+1]+=mak[p];
            if(!mark[p*2+1])
                k[p*2+1]=2;
            s[p*2+1]+=mak[p]*(r-(l+r)/2-1);
            mak[p]=0;
        }
    }else{
        if(mak[p]){
            mak[p*2]+=mak[p];
            if(!mark[p*2])
                k[p*2]=2;
            s[p*2]+=mak[p]*((l+r)/2-l);
            mak[p*2+1]+=mak[p];
            if(!mark[p*2+1])
                k[p*2+1]=2;
            s[p*2+1]+=mak[p]*(r-(l+r)/2-1);
            mak[p]=0;
        }
        if(mark[p]){
            mark[p*2]=mark[p];
            if(!mak[p*2])
                k[p*2]=1;
            s[p*2]=mark[p];
            mark[2*p+1]=mark[p];
            if(!mak[p*2+1])
                k[p*2+1]=1;
            s[p*2+1]=mark[p];
            mark[p]=0;
        }
    }
}
void update1(int p,int l,int r,int x,int y,int v){
    if(x>r || y<l)
        return ;
    if(x<=l && y>=r){
        s[p]=v;
        mark[p]=v;
        if(!mak[p])
            k[p]=1;
        return ;
    }
    down(p,l,r);
    update1(2*p,l,(l+r)/2,x,y,v);
    update1(2*p+1,(l+r)/2+1,r,x,y,v);
    s[p]=max(s[2*p],s[2*p+1]);
}
void update2(int p,int l,int r,int x,int y,int v){
    if(x>r || y<l)
        return ;
    if(x<=l && y>=r){
        s[p]+=v;
        mak[p]=v;
        if(!mark[p])
            k[p]=2;
        return ;
    }
    down(p,l,r);
    update2(2*p,l,(l+r)/2,x,y,v);
    update2(2*p+1,(l+r)/2+1,r,x,y,v);
    s[p]=max(s[2*p],s[2*p+1]);
}
int query(int p,int l,int r,int x,int y){
    if(x>r || y<l)
        return 0;
    if(x<=l && y>=r)
        return s[p];
    down(p,l,r);
    return max(query(2*p,l,(l+r)/2,x,y),query(2*p+1,(l+r)/2+1,r,x,y));
}
int main(){
    cin>>n>>q;
    build(1,1,n);
    for(int i=1,op,l,r,x;i<=q;i++){
        cin>>op>>l>>r;
        if(op==1){
            cin>>x;
            update1(1,1,n,l,r,x);
        }else if(op==2){
            cin>>x;
            update2(1,1,n,l,r,x);
        }else{
            cout<<query(1,1,n,l,r)<<"\n";
        }
    }
    return 0;
}

|