void A1(int l,int r,int k){
int s=w[l],t=w[r];
if(s==t){
for(int i=l;i<=r;i++) b[s]=(b[s]+a[i]*(k-1))%mod,a[i]=(a[i]*k)%mod;
return;
}
for(int i=l;w[i]==s;i++) b[s]=(b[s]+a[i]*(k-1))%mod,a[i]=(a[i]*k)%mod;
for(int i=r;w[i]==t;i--) b[t]=(b[t]+a[i]*(k-1))%mod,a[i]=(a[i]*k)%mod;
for(int i=s+1;i<=t-1;i++) tag[i]=(tag[i]*k)%mod,b[i]=(b[i]*k)%mod;//相当于乘上标记
return;
}
void A2(int l,int r,int k){
int s=w[l],t=w[r];
if(s==t){
for(int i=l;i<=r;i++) a[i]=(a[i]+k)%mod,b[s]=(b[s]+k)%mod;
return;
}
for(int i=l;w[i]==s;i++) a[i]=(a[i]+k)%mod,b[s]=(b[s]+k)%mod;
for(int i=r;w[i]==t;i--) a[i]=(a[i]+k)%mod,b[t]=(b[t]+k)%mod;
for(int i=s+1;i<=t-1;i++) tag[i]=(tag[i]+k)%mod,b[i]=(b[i]+lp[i]*k)%mod;
return;
}
int Q(int l,int r){
int s=w[l],t=w[r],sum=0;
if(s==t){
for(int i=l;i<=r;i++) sum=(sum+a[i]+tag[s])%mod;
return sum;
}
for(int i=l;w[i]==s;i++) sum=(sum+a[i]+tag[s])%mod;
for(int i=r;w[i]==t;i--) sum=(sum+a[i]+tag[t])%mod;
for(int i=s+1;i<=t-1;i++) sum=(sum+b[i])%mod;
return sum;
}
初学分块,发现这样写的话若标记为 0 且是乘法时会错,请大佬指出如何改进?码风类似 OI Wiki,没找到类似的码风......