小粉兔的题解里面这里是懒标记下传同时用懒标记更新子节点的信息,为什么顺序不会影响呢?
或者说跟代码都无关系了,就是为什么懒标记下传将一个区间都覆盖为0/1 和 将区间翻转(0变为1,1变为0) 的两个懒标记顺序无影响呢(同时还更新了子节点)?
如先覆盖为1再翻转(0变为1,1变为0) 0101->1111->0000
先翻转再覆盖 0101->1010->1111
这就不一样啊?
inline void P(int i,int typ){
d&t=dat[i];
if(typ==0) tg2[i]= 0, tg1[i]=0, t=d(0,len[i],0,len[i],0,len[i],0,len[i]);
if(typ==1) tg2[i]= 0, tg1[i]=1, t=d(len[i],0,len[i],0,len[i],0,len[i],0);
if(typ==2) tg2[i]^=1, swap(t.w,t.b), swap(t.lw,t.lb), swap(t.rw,t.rb), swap(t.mw,t.mb);
}
inline void pd(int i){
if(~tg1[i]) P(i<<1,tg1[i]), P(i<<1|1,tg1[i]);
if(tg2[i]) P(i<<1,2), P(i<<1|1,2);
tg1[i]=-1, tg2[i]=0;
}