跪求各位大佬帮忙orz
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,p,m,a[100005],f[400005],jia[400005],cheng[400005],t,g,c,q;
void pushup(int i)
{
f[i]=f[i<<1]+f[i<<1|1],f[i]%=p;
}
void build(int id,int l,int r)
{
if(l==r) { f[id]=a[l]%p; return; }
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
pushup(id);
}
void down(int id,int l,int r)
{
f[id<<1]*=cheng[id],f[id<<1|1]*=cheng[id],f[id<<1]%=p,f[id<<1|1]%=p;
cheng[id<<1]*=cheng[id],cheng[id<<1|1]*=cheng[id],cheng[id<<1]%=p,cheng[id<<1|1]%=p;
if(jia[id]==0) return;
int mid=(l+r)>>1;
f[id<<1]+=jia[id]*(mid-l+1),f[id<<1|1]+=jia[id]*(r-mid),f[id<<1]%=p,f[id<<1|1]%=p;
jia[id<<1]+=jia[id],jia[id<<1|1]+=jia[id],jia[id<<1]%=p,jia[id<<1|1]%=p;
jia[id]=0,cheng[id]=1;
}
void update(int id,int l,int r,int x,int y,int add)
{
if(x<=l&&r<=y) { cheng[id]*=add,jia[id]*=add,f[id]*=add,f[id]%=p,cheng[id]%=p; return; }
down(id,l,r);
int mid=(l+r)>>1;
if(x<=mid) update(id<<1,l,mid,x,y,add);
if(mid<y) update(id<<1|1,mid+1,r,x,y,add);
pushup(id);
}
void update1(int id,int l,int r,int x,int y,int add)
{
if(x<=l&&r<=y) { jia[id]+=add,f[id]+=(r-l+1)*add,jia[id]%=p,f[id]%=p; return; }
down(id,l,r);
int mid=(l+r)>>1;
if(x<=mid) update1(id<<1,l,mid,x,y,add);
if(mid<y) update1(id<<1|1,mid+1,r,x,y,add);
pushup(id);
}
int ask(int id,int l,int r,int x,int y)
{
if(x<=l&&r<=y) return f[id];
down(id,l,r);
int mid=(l+r)>>1,ans=0;
if(x<=mid) ans+=ask(id<<1,l,mid,x,y);
if(mid<y) ans+=ask(id<<1|1,mid+1,r,x,y);
return ans%p;
}
signed main()
{
cin>>n>>m>>p;
for(register int i=1;i<=n;++i) cin>>a[i];
build(1,1,n);
fill(cheng+1,cheng+400001,1);
for(register int i=1;i<=m;++i)
{
cin>>q;
if(q==1)
{
cin>>t>>g>>c;
update(1,1,n,t,g,c);
}
if(q==2)
{
cin>>t>>g>>c;
update1(1,1,n,t,g,c);
}
if(q==3)
{
cin>>t>>g;
cout<<ask(1,1,n,t,g)%p<<endl;
}
}
return 0;
}