线段树的动态开点

long long cnt=1;
long long sum[maxn*150],lazy[maxn*150],Lnode[maxn*150],Rnode[maxn*150];
void PushUp(long long rt){sum[rt]=sum[Lnode[rt]]+sum[Rnode[rt]];}
void PushDown(long long rt,long long ln,long long rn){
    if(lazy[rt]){//1非工作人,2工作日
        lazy[Lnode[rt]]+=lazy[rt];sum[Lnode[rt]]+=lazy[rt]*ln;
        lazy[Rnode[rt]]+=lazy[rt];sum[Rnode[rt]]+=lazy[rt]*rn;
        lazy[rt]=0;
    }
}
void Update(long long L,long long R,long long C,long long l,long long r,long long rt){
    if(L<=l&&r<=R) {
        sum[rt] += C*(r-l+1);
        lazy[rt] += C;
        return;
    }
    long long m=(l+r)>>1;
    if(!Lnode[rt])Lnode[rt]=++cnt;
    if(!Rnode[rt])Rnode[rt]=++cnt;
    PushDown(rt,m-l+1,r-m);
    if(L <= m)Update(L,R,C,l,m,Lnode[rt]);
    if(R >  m)Update(L,R,C,m+1,r,Rnode[rt]);
    PushUp(rt);
}
long long Query(long long L,long long R,long long l,long long r,long long rt){
    if(L<=l&&r<=R){
        return sum[rt];
    }
    long long m=(l+r)>>1;
    long long ANS=0;
    PushDown(rt,m-l+1,r-m);
    if(L <= m)ANS+=Query(L,R,l,m,Lnode[rt]);
    if(R >  m )ANS+=Query(L,R,m+1,r,Rnode[rt]);
    return ANS;
}

 

posted @ 2020-10-13 14:28  yesuweiYYYY  阅读(133)  评论(0编辑  收藏  举报