数据结构|线段树|区间比较修改单点查询max

struct stree{
    int t[400005],tag[400005];
    inline void push_up(int p){
        t[p>>1]=max(t[p>>1],t[p]);
    }
    inline void push_down(int p){
        t[p<<1]=max(t[p<<1],tag[p]);
        tag[p<<1]=max(tag[p<<1],tag[p]);
        t[p<<1|1]=max(t[p<<1|1],tag[p]);
        tag[p<<1|1]=max(tag[p<<1|1],tag[p]);
    }
    void update(int p,int l,int r,int x,int y,int v){
        if(r<x||l>y)return ;
        if(x<=l&&y>=r){
            t[p]=max(t[p],v);
            tag[p]=max(tag[p],v);
            return ;
        }
        int mid=(l+r)/2;
        push_down(p);
        update(p<<1,l,mid,x,y,v);
        update(p<<1|1,mid+1,r,x,y,v);
        push_up(p);
    }
    int query(int p,int l,int r,int v){
        if(l==r)return t[p];
        int mid=(l+r)/2;
        push_down(p);
        if(v<=mid)return query(p<<1,l,mid,v);
        else return query(p<<1|1,mid+1,r,v);
    }
}st;
posted @ 2025-08-17 15:48  一位XXS  阅读(8)  评论(0)    收藏  举报