求助各位大佬,第2,9,10个测试点wa掉了,不知道哪里出的问题
#include<bits/stdc++.h>
using namespace std;
#define maxn 100860
#define ll long long
struct tree{
int l,r,len;
ll v,add,mul=1;
}t[maxn*4];
int n,m,q,op,l,r,P;
ll v,a[maxn];
void brush(int p);
void down(int p,int he,int ji);
void build(int p,int l,int r){
int mid=(l+r)/2;
t[p].l=l;t[p].r=r;
t[p].mul=1;t[p].add=0;
t[p].len=r-l+1;
if(l==r){
t[p].v=a[l]%P;
return ;
}
else{
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].v=(t[p*2+1].v+t[p*2].v)%P;
}
}
void add(int p,int l,int r,ll v){
if(l>t[p].r||r<t[p].l)return;
else{
if(t[p].r<=r&&t[p].l>=l){
t[p].v+=t[p].len*v;t[p].v%=P;
t[p].add+=v;t[p].add%=P;//加的时候正常
}
else{
brush(p);
add(p*2,l,r,v);
add(p*2+1,l,r,v);
t[p].v=(t[p*2].v+t[p*2+1].v)%P;
}
}
}
void mul(int p,int l,int r,ll v){
if(l>t[p].r||r<t[p].l)return;
else{
if(t[p].r<=r&&t[p].l>=l){
t[p].v*=v;t[p].v%=P;
t[p].mul*=v;t[p].mul%=P;
t[p].add*=v;t[p].add%=P;//处理乘法标记的时候要乘加法
}
else{
brush(p);
mul(p*2,l,r,v);
mul(p*2+1,l,r,v);
t[p].v=(t[p*2].v+t[p*2+1].v)%P;
}
}
}
void brush(int p){
if(t[p].add||t[p].mul>1){
down(p*2,t[p].add,t[p].mul);
down(p*2+1,t[p].add,t[p].mul);
t[p].add=0;
t[p].mul=1;
}
}
void down(int p,int he,int ji){
t[p].v*=ji;t[p].v%=P;
t[p].v+=he*t[p].len;t[p].v%=P;
t[p].mul=(t[p].mul*ji)%P;
t[p].add=(t[p].add*ji+he)%P;
}
ll query(int p,int l,int r){
if(l>t[p].r||r<t[p].l)
return 0;
else{
if(t[p].r<=r&&t[p].l>=l){
return t[p].v%P;
}
else{
brush(p);
return (query(p*2,l,r)+query(p*2+1,l,r))%P;
}
}
}
int main(){
cin>>n>>q>>P;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--){
scanf("%d",&op);
if(op==2){
scanf("%d%d%lld",&l,&r,&v);
// cin>>l>>r>>v;
add(1,l,r,v);
}
else if(op==1){
// cin>>l>>r>>v;
scanf("%d%d%lld",&l,&r,&v);
mul(1,l,r,v);
}
else{
scanf("%d%d",&l,&r);
printf("%lld\n",query(1,l,r));
}
}
return 0;
}