RT,求帮看看传递懒标记的时候这么写有没有问题,操作就是区间赋值,区间清零,区间反转。
int sum[N<<2];
int lazy[N<<2],rev[N<<2];
void init_lazy(){memset(lazy,-1,sizeof(lazy));}
inline void add(int k,int l,int r,int vl,int vr)
{
//lazy/vl:初始-1,区间覆盖1,区间清除0
//rev/vr: 初始0,区间反转1
if(vl!=-1) lazy[k]=vl;
if(vr)
{
rev[k]^=1;
if(vl==-1) sum[k]=r-l+1-sum[k];
else if(vl==1) sum[k]=0;
else sum[k]=r-l+1;
}
else
{
if(vl==-1) sum[k]=r-l+1-sum[k];
else if(vl==1) sum[k]=r-l+1;
else sum[k]=0;
}
}
inline void pushdown(int k,int l,int r)
{
if(lazy[k]==-1&&!rev[k]) return;
add(ls,l,mid,lazy[k],rev[k]);
add(rs,mid+1,r,lazy[k],rev[k]);
lazy[k]=-1,rev[k]=0;
}