更新,线段树模板(支持相关基本操作)

#define ls p<<1
#define rs p<<1|1
struct Seg
{
    int p,l,r;
    ll sum,tag,mx;
#define l(i) t[i].l
#define r(i) t[i].r
#define mx(i) t[i].mx
#define tag(i) t[i].tag
#define sum(i) t[i].sum
}t[N<<2];

void pushup(int p)
{
    sum(p)=sum(ls)+sum(rs);
    mx(p)=max(mx(ls),mx(rs));
}
void pushdown(int p)
{
    if(tag(p))
    {
        sum(ls)+=tag(p)*(r(ls)-l(ls)+1);
        sum(rs)+=tag(p)*(r(rs)-l(rs)+1);
        mx(ls)+=tag(p);mx(rs)+=tag(p);
        tag(ls)+=tag(p);
        tag(rs)+=tag(p);
        tag(p)=0;
    }
}
void build(int p,int l,int r)
{
    l(p)=l;r(p)=r;
    if(l==r)
    {
        mx(p)=sum(p)=a[l];
        return;
    }
    int mid=l+r>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(p);
}
void update(int p,int l,int r,ll d)
{
    if(l<=l(p)&&r>=r(p))
    {
        sum(p)+=d*(r(p)-l(p)+1);
        mx(p)+=d;
        tag(p)+=d;
        return;
    }
    pushdown(p);
    int mid=(l(p)+r(p))>>1;
    if(l<=mid) update(ls,l,r,d);
    if(r>mid) update(rs,l,r,d);
    pushup(p);
}
void change(int p,int x,ll d)
{
    if(l(p)==r(p))
    {
        mx(p)+=d;sum(p)+=d;
        return;
    }
    pushdown(p);
    int mid=(l(p)+r(p))>>1;
    if(x<=mid) change(ls,x,d);
    else change(rs,x,d);
   pushup(p); } ll query(
int p,int l,int r) { if(l<=l(p)&&r>=r(p)) return sum(p); pushdown(p); int mid=l(p)+r(p)>>1; ll ans=0; if(l<=mid) ans+=query(ls,l,r); if(r>mid) ans+=query(rs,l,r); return ans; } ll ask(int p,int l,int r) { if(l<=l(p)&&r>=r(p)) return mx(p); pushdown(p); int mid=l(p)+r(p)>>1; ll ans=-0x3f3f3f3f3f3f3f3f; if(l<=mid) ans=max(ans,ask(ls,l,r)); if(r>mid) ans=max(ans,ask(rs,l,r)); return ans; }

 

posted @ 2019-08-19 21:13  Suiyue_Li  阅读(199)  评论(0)    收藏  举报