20pts五彩斑斓马蜂良好求条
查看原帖
20pts五彩斑斓马蜂良好求条
1432988
Yeonjun_0913楼主2025/7/21 10:28

rt,玄一关
AC on #1,3
WA on #2&4-9
RE on #10

#include <iostream>
using namespace std;

typedef long long ll;
const int N=1e6+5;
const ll no_cover=1e9+5;
struct node{
    int l,r;
    ll maxn,add_tag,cover_tag;
} tr[N<<2];
int n,q;
ll a[N];
inline void push_up(int u){
    tr[u].maxn=max(tr[u<<1].maxn,tr[(u<<1)+1].maxn);
}
void build(int u,int l,int r){
    tr[u].l=l,tr[u].r=r;
    if (l==r){
        tr[u].maxn=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(u<<1,l,mid);
    build((u<<1)+1,mid+1,r);
    push_up(u);
}
inline void push_cover(int u){
    if (tr[u].cover_tag!=no_cover){
        int ls=u<<1,rs=(u<<1)+1;
        tr[ls].cover_tag=tr[rs].cover_tag=tr[u].cover_tag;
        tr[ls].maxn=tr[rs].maxn=tr[u].cover_tag;
        tr[u].cover_tag=no_cover;
        tr[ls].add_tag=tr[rs].add_tag=0;
    }
}
inline void push_add(int u){
    if (tr[u].add_tag){
        push_cover(u);
        int ls=u<<1,rs=(u<<1)+1;
        tr[ls].maxn+=tr[u].add_tag;
        tr[rs].maxn+=tr[u].add_tag;
        tr[ls].add_tag+=tr[u].add_tag;
        tr[rs].add_tag+=tr[u].add_tag;
        tr[u].add_tag=0;
    }
}
inline void pushdown(int u){
    push_cover(u);
    push_add(u);
}
void cover(int u,int l,int r,int v){
    if (tr[u].l>=l&&tr[u].r<=r){
        tr[u].add_tag=0;
        tr[u].maxn=v;
        tr[u].cover_tag=v;
        return;        
    }
    pushdown(u);
    int mid=(tr[u].l+tr[u].r)/2;
    if (l<=mid) cover(u<<1,l,r,v);
    if (r>mid) cover((u<<1)+1,l,r,v);
    push_up(u);
}
void upd(int u,int l,int r,int v){
    if (tr[u].l>=l&&tr[u].r<=r){
        push_cover(u);
        tr[u].maxn+=v;
        tr[u].add_tag+=v;
        return;
    }
    pushdown(u);
    int mid=(tr[u].l+tr[u].r)/2;
    if (l<=mid) upd(u<<1,l,r,v);
    if (r>mid) upd((u<<1)+1,l,r,v);
    push_up(u);
}
ll query(int u,int l,int r){
    if (l<=tr[u].l&&tr[u].r<=r){
        return tr[u].maxn;
    }
    pushdown(u);
    int mid=(tr[u].l+tr[u].r)/2;
    ll res=-1e18;
    if (l<=mid) res=max(res,query(u<<1,l,mid));
    if (r>mid) res=max(res,query((u<<1)+1,mid+1,r));
    return res;
}

int main (){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> q;
    for (int i=1;i<=n;i++){
        cin >> a[i];
    }
    build(1,1,n);
    for (int i=1;i<=(n<<2);i++){
        tr[i].cover_tag=no_cover;
    }
    int op,l,r;
    ll x;
    while (q--){
        cin >> op >> l >> r;
        if (op==1){
            cin >> x;
            cover(1,l,r,x);
        }else if (op==2){
            cin >> x;
            upd(1,l,r,x);
        }else {
            cout << query(1,l,r) << endl;
        }
    }
    return 0;
}
2025/7/21 10:28
加载中...