pushdown区间写错了,这是我的code,sum=你的data,mul,add你看得懂吧
```cpp
tree[id<<1].sum=(tree[id].mul*tree[id<<1].sum+tree[id].add*(tree[id<<1].r-tree[id<<1].l+1))%mod;
tree[id<<1|1].sum=(tree[id].mul*tree[id<<1|1].sum+tree[id].add*(tree[id<<1|1].r-tree[id<<1|1].l+1))%mod;
tree[id<<1].mul=(tree[id<<1].mul*tree[id].mul)%mod;
tree[id<<1|1].mul=(tree[id<<1|1].mul*tree[id].mul)%mod;
tree[id<<1].add=(tree[id<<1].add*tree[id].mul+tree[id].add)%mod;
tree[id<<1|1].add=(tree[id<<1|1].add*tree[id].mul+tree[id].add)%mod;
tree[id].mul=1;
tree[id].add=0;
```
by zyh0516_lucky @ 2023-10-10 00:25:46
写反了吧
```cpp
updatemul(int l,int r,int s,int c,int t,int p)
```
```cpp
if(l<=s && c<=r)
```
```cpp
updatemul(l,r,1,n,k%m,1)
```
by zyh0516_lucky @ 2023-10-10 00:29:21
```cpp
void updateadd(int l,int r,int s,int c,int t,int p){
if(l<=s && c<=r){
tree[p].data=(tree[p].data+(c-s+1)*t)%m,tree[p].addlazy+=t;//忘模了吧
```
by zyh0516_lucky @ 2023-10-10 00:32:37
可能还有错,这是我的代码,应该挺好懂的吧
```cpp
#include <bits/stdc++.h>
#define MAXN 100005
#define ll long long
using namespace std;
ll n,m,a[MAXN],mod;
struct node{
ll l,r,sum,add,mul;
}tree[MAXN*4];
void push_down(ll id){
tree[id<<1].sum=(tree[id].mul*tree[id<<1].sum+tree[id].add*(tree[id<<1].r-tree[id<<1].l+1))%mod;
tree[id<<1|1].sum=(tree[id].mul*tree[id<<1|1].sum+tree[id].add*(tree[id<<1|1].r-tree[id<<1|1].l+1))%mod;
tree[id<<1].mul=(tree[id<<1].mul*tree[id].mul)%mod;
tree[id<<1|1].mul=(tree[id<<1|1].mul*tree[id].mul)%mod;
tree[id<<1].add=(tree[id<<1].add*tree[id].mul+tree[id].add)%mod;
tree[id<<1|1].add=(tree[id<<1|1].add*tree[id].mul+tree[id].add)%mod;
tree[id].mul=1;
tree[id].add=0;
return;
}
void push_up(ll id){
tree[id].sum=(tree[id<<1].sum+tree[id<<1|1].sum)%mod;
return;
}
void build(ll l,ll r,ll id){
tree[id].l=l;
tree[id].r=r;
tree[id].mul=1;
tree[id].add=0;
if(l==r){
tree[id].sum=a[l]%mod;
return;
}
ll mid=l+r>>1;
build(l,mid,id<<1);
build(mid+1,r,id<<1|1);
push_up(id);
return;
}
void update_mul(ll l,ll r,ll id,ll k){
if(l<=tree[id].l&&tree[id].r<=r){
tree[id].mul=(tree[id].mul*k)%mod;
tree[id].add=(tree[id].add*k)%mod;
tree[id].sum=(tree[id].sum*k)%mod;
return;
}
push_down(id);
ll mid=(tree[id].l+tree[id].r)>>1;
if(l<=mid) update_mul(l,r,id<<1,k);
if(r>mid) update_mul(l,r,id<<1|1,k);
push_up(id);
return;
}
void update_add(ll l,ll r,ll id,ll k){
if(l<=tree[id].l&&tree[id].r<=r){
tree[id].add=(tree[id].add+k)%mod;
tree[id].sum=(tree[id].sum+k*(tree[id].r-tree[id].l+1))%mod;
return;
}
push_down(id);
ll mid=(tree[id].l+tree[id].r)>>1;
if(l<=mid) update_add(l,r,id<<1,k);
if(r>mid) update_add(l,r,id<<1|1,k);
push_up(id);
return;
}
ll query(ll l,ll r,ll id){
if(l<=tree[id].l&&tree[id].r<=r) return tree[id].sum;
push_down(id);
ll val=0;
ll mid=(tree[id].l+tree[id].r)>>1;
if(l<=mid) val=(val+query(l,r,id<<1))%mod;
if(r>mid) val=(val+query(l,r,id<<1|1))%mod;
return val;
}
int main(){
ll pos,x,y,k;
scanf("%lld %lld %lld",&n,&m,&mod);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,n,1);
while(m--){
scanf("%lld",&pos);
if(pos==1){
scanf("%lld %lld %lld",&x,&y,&k);
update_mul(x,y,1,k);
}
if(pos==2){
scanf("%lld %lld %lld",&x,&y,&k);
update_add(x,y,1,k);
}
if(pos==3){
scanf("%lld %lld",&x,&y);
printf("%lld\n",query(x,y,1));
}
}
return 0;
}
```
by zyh0516_lucky @ 2023-10-10 00:36:47