原来的写法:
```cpp
inline void pushnow(int x,int add,int mul){
if(!x)return;
t[x].data=(t[x].data*mul+add)%mod;
t[x].add=(t[x].add*mul+add)%mod;
t[x].mul=t[x].mul*mul%mod;
t[x].sum=(t[x].sum*mul+t[x].size*add)%mod;
}
inline void pushdown(int x){
if(t[x].lazy){
t[x].lazy=false;
pushlazy(lc);pushlazy(rc);
}
if(t[x].add||t[x].mul){
pushnow(lc,t[x].add,t[x].mul);
pushnow(rc,t[x].add,t[x].mul);
t[x].add=0,t[x].mul=1;
}
}
```
改正后的写法:
```cpp
inline void pushnowa(int x,int val){
if(val==0)return;
t[x].add+=val;t[x].data+=val;t[x].sum+=t[x].size*val;
t[x].add%=mod;t[x].data%=mod;t[x].sum%=mod;
}
inline void pushnowm(int x,int val){
if(val==1)return;
t[x].add*=val;t[x].mul*=val;t[x].sum*=val;t[x].data*=val;
t[x].add%=mod;t[x].mul%=mod;t[x].sum%=mod;t[x].data%=mod;
}
inline void pushdown(int x){
if(t[x].lazy){
t[x].lazy=false;
pushlazy(lc);pushlazy(rc);
}
if(t[x].mul!=1){
pushnowm(lc,t[x].mul);
pushnowm(rc,t[x].mul);
t[x].mul=1;
}
if(t[x].add){
pushnowa(lc,t[x].add);
pushnowa(rc,t[x].add);
t[x].add=0;
}
}
```
by Feyn @ 2022-02-26 12:54:16
为什么就改了这么一点,把加lazy和乘lazy拆开处理之后就过了啊……
by Feyn @ 2022-02-26 12:55:03
先乘后加
by Kyo1337 @ 2022-02-26 12:58:21
@[Custlo_](/user/270532) 谢谢大佬,只不过刚才发现错误不在那里
by Feyn @ 2022-02-26 13:02:38
错误是改正前写法里pushdown函数那行
```if(t[x].add||t[x].mul)```
应该写作
```if(t[x].add||t[x].mul!=1)```
一个很低级的错误……
by Feyn @ 2022-02-26 13:04:17
此帖终结
by Feyn @ 2022-02-26 13:04:35