线段树区间更新

void build(int r,int L,int R)
{
    if(L==R) sum[1] = 1;
    else{
        int M = (L+R)/2;
        build(r*2,L,M);
        build(r*2+1,M+1,R);
        sum[r] = sum[r*2] + sum[r*2+1];
    }
}

void push_up(int r,int L,int R)
{
    if(lazy[r]>0)
    {
        sum[r] = lazy[r]*(R-L+1);
    }
    else
    {
        sum[r] = sum[r*2] + sum[r*2+1];
    }
}

void push_down(int r)
{
    if(lazy[r]>0)
    {
        lazy[r*2] = lazy[r*2+1] = lazy[r];
        lazy[r] = 0;
    }
}

void update(int r,int L,int R,int ql,int qr,int val)
{
    if(ql<=L&&R<=qr)
    {
        lazy[r] = val;
        sum[r] = val*(R-L+1);
    }
    else
    {
        int M=(L+R)/2;
        if(ql<=M) update(r*2,L,M,ql,qr,val);
        else push_up(r*2,L,M);
        if(qr>M) update(r*2+1,M+1,R,ql,qr,val);
        else push_up(r*2+1,M+1,R);
        
        push_up(r,L,M);
    }
}

void query(int r,int L,int R,int ql,int qr)
{
    if(lazy[r]>0)
        total += lazy[r]*(min(R,qr)-max(L,ql)+1);
    else if(ql<=L&&R<=qr)
        total += sum[r];
    else
    {
        int M = (L+R)/2;
        if(ql<=M)
            query(r*2,L,M,ql,qr);
        if(qr>=M)
            quert(r*2+1,M+1,R,ql,qr);
    }
}

 

你可能感兴趣的:(线段树)