样例都过不去,我实在找不到问题在哪,那个大佬帮忙看看
#include <bits/stdc++.h>
#define zz p*2
#define yz p*2+1
using namespace std;
long long n,m,mo,a[10000000];
struct tree{
long long l,r,w,j,c;//左,右,值,加tag,乘tag
};
tree t[10000000];
void build(int p,int l,int r){
t[p].l=l;t[p].r=r;t[p].c=1;
if(l==r){
t[p].w=a[l]%mo;return;
}
build(zz,l,(l+r)/2);
build(yz,(l+r)/2+1,r);
t[p].w=(t[zz].w+t[yz].w)%mo;
}
void down(int p){
t[zz].c=(t[p].c*t[zz].c)%mo;
t[yz].c=(t[p].c*t[yz].c)%mo;
t[zz].j=(t[p].c*t[zz].j+t[p].j)%mo;
t[yz].j=(t[p].c*t[yz].j+t[p].j)%mo;
t[zz].w=(t[p].c*t[zz].w+t[p].j*(t[zz].r-t[zz].l+1))%mo;
t[yz].w=(t[p].c*t[yz].w+t[p].j*(t[yz].r-t[yz].l+1))%mo;
t[p].j=0;t[p].c=1;
}
void add(int p,int l,int r,int k){
if(t[p].l>r||t[p].r<l) return;
if(t[p].l>=l&&t[p].r<=r){
t[p].j=(k+t[p].j)%mo;
t[p].w=(k*(t[p].r-t[p].l+1)+t[p].w)%mo;
return;
}
down(p);
int mid=(t[p].l+t[p].r)/2;
if(l<=mid) add(zz,l,r,k);
if(r>mid) add(yz,l,r,k);
t[p].w=(t[zz].w+t[yz].w)%mo;
}
void ch(int p,int l,int r,int k){
if(t[p].l>r||t[p].r<l) return;
if(t[p].l>=l&&t[p].r<=r){
t[p].c=(k*t[p].c)%mo;
t[p].j=(k*t[p].j)%mo;
t[p].w=(k*t[p].w)%mo;
return;
}
down(p);
int mid=(t[p].l+t[p].r)/2;
if(l<=mid) ch(zz,l,r,k);
if(r>mid) ch(yz,l,r,k);
t[p].w=(t[zz].w+t[yz].w)%mo;
}
long long check(int p,int l,int r){
if(t[p].l>r||t[p].r<l) return 0;
if(t[p].l>=l&&t[p].r<=r) return t[p].w;
down(p);
long long an=0;
int mid=(t[p].l+t[p].r)/2;
if(l<=mid) an=(check(zz,l,r)+an)%mo;
if(r<mid) an=(check(yz,l,r)+an)%mo;
return an;
}
int main(){
cin>>n>>m>>mo;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
int b,x,y,z;
cin>>b;
if(b==1){
cin>>x>>y>>z;
ch(1,x,y,z);
}
if(b==2){
cin>>x>>y>>z;
add(1,x,y,z);
}
if(b==3){
cin>>x>>y;
cout<<check(1,x,y)<<endl;
}
}
return 0;
}