`tr[lc].ad*=tr[x].mul%q+tr[x].ad`等价于`tr[lc].ad=tr[lc].ad*(tr[x].mul%q+tr[x].ad)`,应该改成`tr[lc].ad=(1ll*tr[lc].ad*tr[x].mul+tr[x].ad)%q`
by Guoyh @ 2023-08-21 23:10:49
@[I_ak_iOi_2024](/user/510311) 还有你好像没开long long
by Guoyh @ 2023-08-21 23:11:28
@[I_ak_iOi_2024](/user/510311) `a*=(...)`会先把右边的表达式算出来再乘到a上,你好像理解错了
by Guoyh @ 2023-08-21 23:14:05
@[Guoyh](/user/88449) 确实是个错误 已关
by I_ak_iOi_2024 @ 2023-08-22 10:03:58
```cpp
#include<bits/stdc++.h>
#define lc x<<1
#define rc (x<<1)|1
#define ll long long
using namespace std;
ll n,m,q,a[4000010];
struct node{
ll sm,mul,ad;
}tr[400010];
void update(ll x){
tr[x].sm=(tr[lc].sm+tr[rc].sm)%q;
}
void build(ll x,ll l,ll r){
tr[x].mul=1;
if(l==r) {
tr[x].sm=a[l];
return;
}
ll mid=l+r>>1;
build(lc,l,mid);build(rc,mid+1,r);
update(x);
}
void pushdown(ll x,ll l,ll r){
tr[lc].ad=(tr[lc].ad*tr[x].mul+tr[x].ad)%q;tr[rc].ad=(tr[rc].ad*tr[x].mul+tr[x].ad)%q;
ll mid=l+r >>1;
tr[lc].sm*=tr[x].mul%q;tr[rc].sm*=tr[x].mul%q;
tr[lc].mul*=tr[x].mul%q;tr[rc].mul*=tr[x].mul%q;
tr[lc].sm=(tr[lc].sm+(mid-l+1)*tr[x].ad)%q;tr[rc].sm=(tr[rc].sm+(r-mid)*tr[x].ad)%q;
tr[x].mul=1;tr[x].ad=0;
}
void modifyad(int x,int l,int r,int L,int R,int d){
if(l==L&&r==R) {
tr[x].sm+=(r-l+1)*d%q;
tr[x].ad+=d%q;
return;
}
int mid=l+r >>1;
pushdown(x,l,r);
if(R<=mid) modifyad(lc,l,mid,L,R,d);
else if(L>mid) modifyad(rc,mid+1,r,L,R,d);
else modifyad(lc,l,mid,L,mid,d),modifyad(rc,mid+1,r,mid+1,R,d);
update(x);
}
void modifymul(ll x,ll l,ll r,ll L,ll R,ll d){
if(l==L&&r==R) {
tr[x].ad*=d%q;
tr[x].sm*=d%q;
tr[x].mul*=d%q;
return;
}
ll mid=l+r >>1;
pushdown(x,l,r);
if(R<=mid) modifymul(lc,l,mid,L,R,d);
else if(L>mid) modifymul(rc,mid+1,r,L,R,d);
else modifymul(lc,l,mid,L,mid,d),modifymul(rc,mid+1,r,mid+1,R,d);
update(x);
}
ll query(ll x,ll l,ll r,ll L,ll R){
if(l==l&&r==R) return tr[x].sm;
ll mid=l+r>>1;
pushdown(x,l,r);
if(R<=mid) return query(lc,l,mid,L,R);
else if(L>mid) return query(rc,mid+1,r,L,R);
else return query(lc,l,mid,L,mid)+query(rc,mid+1,r,mid+1,R)%q;
}
int main(){
//freopen(" ","r",stdin);
//freopen(" ","w",stdout);
cin>> n >> m>>q ;
for(ll i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
ll op,x,y,k;
scanf("%d%d%d",&op,&x,&y);
if(op==1){
cin>> k;
modifymul(1,1,n,x,y,k);
}
if(op==2){
cin>> k;
modifyad(1,1,n,x,y,k);
}
if(op==3){
cout << query(1,1,n,x,y)%q<<'\n';
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
```
~~似乎还有些问题~~
by I_ak_iOi_2024 @ 2023-08-22 10:04:30
@[I_ak_iOi_2024](/user/510311) 你把所有+=和*=都改掉
by Guoyh @ 2023-08-22 14:04:39
```cpp
if(l==l&&r==R) return tr[x].sm;
```
~~wdnmd手残服了~~
by I_ak_iOi_2024 @ 2023-08-22 15:20:36
@[Guoyh](/user/88449) 感谢感谢
by I_ak_iOi_2024 @ 2023-08-22 15:21:02
————结束线——————
by I_ak_iOi_2024 @ 2023-08-22 15:21:46