看了好久还是没找到自己的问题出在哪。。
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
int num;
int add=0;
int mul=1;
}t[2000009];
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0) x=~x+1,putchar('-');if(x>9) write(x/10);putchar(x%10+'0');}
int n,m,P,a[100009],op,x,y,k;
void push_up(int p){
t[p].num=t[p*2].num+t[p*2+1].num;
t[p].num%=P;
}
void push_down(int p, int l, int r){
int m=(l+r)/2;
t[p*2].num=(t[p*2].num*t[p].mul+t[p].add*(m-l+1))%P;
t[p*2+1].num=(t[p*2+1].num*t[p].mul+t[p].add*(r-m))%P;
t[p*2].mul=(t[p*2].mul*t[p].mul)%P;
t[p*2+1].mul=(t[p*2+1].mul*t[p].mul)%P;
t[p*2].add=(t[p*2].add*t[p].mul+t[p].add)%P;
t[p*2+1].add=(t[p*2+1].add*t[p].mul+t[p].add)%P;
t[p].mul=1;
t[p].add=0;
return;
}
void build(int l,int r,int p){
if(l==r){
t[p].num=a[l];
return;
}
int mid=(l+r)/2;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
push_up(p);
}
void update_add(int l,int r,int nowl,int nowr,int k,int p){
if(l<=nowl&&nowr<=r){
t[p].add=(t[p].add*k)%P;
t[p].num=(t[p].num+(nowr-nowl+1)*k)%P;
return;
}
push_down(p,nowl,nowr);
int mid=(nowl+nowr)/2;
if(mid>=l) update_add(l,r,nowl,mid,k,p*2);
if(mid<r) update_add(l,r,mid+1,nowr,k,p*2+1);
push_up(p);
}
void update_mul(int l,int r,int nowl,int nowr,int k,int p){
if(l<=nowl&&nowr<=r){
t[p].num=(t[p].num*k)%P;
t[p].mul=(t[p].mul*k)%P;
t[p].add=(t[p].add*k)%P;
return;
}
push_down(p,nowl,nowr);
int mid=(nowl+nowr)/2;
if(mid>=l) update_mul(l,r,nowl,mid,k,p*2);
if(mid<r) update_mul(l,r,mid+1,nowr,k,p*2+1);
push_up(p);
}
int query(int l,int r,int nowl,int nowr,int p){
if(l<=nowl&&nowr<=r) return t[p].num;
push_down(p,nowl,nowr);
int mid=(nowl+nowr)/2;
int sum=0;
if(mid>=l) sum+=query(l,r,nowl,mid,p*2);
if(mid<r) sum+=query(l,r,mid+1,nowr,p*2+1);
return sum;
}
void solve(){
n=read(),m=read(),P=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,n,1);
while(m--){
cin>>op;
if(op==1){
x=read(),y=read(),k=read();
update_mul(x,y,1,n,k,1);
}
if(op==2){
x=read(),y=read(),k=read();
update_add(x,y,1,n,k,1);
}
if(op==3){
x=read(),y=read();
cout<<query(x,y,1,n,1)%P<<endl;
}
}
}
signed main(){
solve();
}