观察如下代码:
void upd(int x,int y){
int u=b[x];
while(x<=n){
s[x]+=(y-u)%mod;
s[x]=(s[x]+mod)%mod;
sqs[x]+=(y*y%mod-u*u%mod)%mod;
sqs[x]=(sqs[x]+mod)%mod;
x+=lowbit(x);
}
}
改为:
void upd(int x,int y){
int u=b[x];
int lst=x;
while(x<=n){
s[x]+=(y-u)%mod;
s[x]=(s[x]+mod)%mod;
sqs[x]+=(y*y%mod-u*u%mod)%mod;
sqs[x]=(sqs[x]+mod)%mod;
x+=lowbit(x);
}b[lst]=y;
}