求求dalao帮忙,不知道哪里错了
#include<bits/stdc++.h>
#define ll long long
#define Mx 100001
using namespace std;
int n,m,mod;
ll a[Mx],ans[Mx<<1],laz_add[Mx<<1],laz_mul[Mx<<1];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void Do_add(int l,int r,int p,ll k){
laz_add[p]+=k;
laz_add[p]%=mod;
ans[p]+=(r-l+1)*k;ans[p]%=mod;
}
inline void Do_mul(int p,ll k){
laz_add[p]*=k;
laz_add[p]%=mod;
laz_mul[p]*=k;
laz_mul[p]%=mod;
ans[p]*=k;ans[p]%=mod;
}
inline void push_up(int p){
ans[p]=(ans[ls(p)]+ans[rs(p)])%mod;
}
inline void push_down(ll l,ll r,ll p){
int mid=(l+r)>>1;
int l1=laz_add[p],l2=laz_mul[p];
if(l2>1){
Do_mul(ls(p),l2);Do_mul(rs(p),l2);
laz_mul[p]=0;
}
if(l1>0){
Do_add(l,mid,ls(p),l1);
Do_add(mid+1,r,rs(p),l1);
laz_add[p]=0;
}
}
inline void build(int l,int r,int p){
if(l==r){
ans[p]=a[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
push_up(p);
}
inline void add(int nl,int nr,int l,int r,int p,ll k){
if(nl<=l&&r<=nr){
Do_add(l,r,p,k);return ;
}
push_down(l,r,p);
int mid=(l+r)>>1;
if(nl<=mid)add(nl,nr,l,mid,ls(p),k);
if(nr>mid)add(nl,nr,mid+1,r,rs(p),k);
push_up(p);
}
inline void mul(int nl,int nr,int l,int r,int p,ll k){//k\=0
if(nl<=l&&r<=nr){
Do_mul(p,k);return ;
}
push_down(l,r,p);
int mid=(l+r)>>1;
if(nl<=mid)mul(nl,nr,l,mid,ls(p),k);
if(nr>mid)mul(nl,nr,mid+1,r,rs(p),k);
push_up(p);
}
inline ll query(int x,int y,int l,int r,int p){
ll res=0;
if(x<=l&&r<=y)return ans[p];
push_down(l,r,p);
ll mid=(l+r)>>1;
if(x<=mid)res=(res+query(x,y,l,mid,ls(p)))%mod;
if(y>mid)res=(res+query(x,y,mid+1,r,rs(p)))%mod;
return res;
}
int main(){
int t,x,y;ll k;
scanf("%d%d%d",&n,&m,&mod);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);a[i]%=mod;
}
build(1,n,1);
while(m--){
scanf("%d%d%d",&t,&x,&y);
if(t==1){
scanf("%lld",&k);
mul(x,y,1,n,1,k);
/* for(int i=1;i<=n*2;++i){
printf("%lld\n",ans[i]);
} */
}
else if(t==2){
scanf("%lld",&k);
add(x,y,1,n,1,k);
/*for(int i=1;i<=n*2;++i){
printf("%lld\n",ans[i]);
} */
}else{
printf("%lld\n",query(x,y,1,n,1));
}
}
return 0;
}