rt,怀疑是push_down出了问题
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int n,q,mod;
int a[N],t[N<<2],d[N<<2],c[N<<2];
void build(int p,int l,int r)
{
c[p]=1;
if(l==r)
{
t[p]=a[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p]=t[p<<1]+t[p<<1|1];
t[p]%=mod;
}
void push_down(int p,int l,int r)
{
int ls=p<<1,rs=p<<1|1,mid=(l+r)>>1;
d[ls]+=d[p];d[rs]+=d[p];
t[ls]+=(mid-l+1)*d[p];
t[rs]+=(r-mid)*d[p];
d[p]=0;
d[ls]%=mod;d[rs]%=mod;
t[ls]%=mod;t[rs]%=mod;
c[ls]*=c[p];c[rs]*=c[p];
t[ls]*=c[p];t[rs]*=c[p];
c[p]=1;
c[ls]%=mod;c[rs]%=mod;
t[ls]%=mod;t[rs]%=mod;
}
int query(int p,int l,int r,int nl,int nr)
{
if(l<=nl&&nr<=r)return t[p];
push_down(p,nl,nr);
int mid=(nl+nr)>>1,res=0;
if(l<=mid)res=query(p<<1,l,r,nl,mid);
if(mid<r)res+=query(p<<1|1,l,r,mid+1,nr);
res%=mod;
return res;
}
void update(int p,int l,int r,int nl,int nr,int x)
{
push_down(p,nl,nr);
if(l<=nl&&nr<=r)
{
d[p]+=x;
t[p]+=(nr-nl+1)*x;
d[p]%=mod;
t[p]%=mod;
return;
}
int mid=(nl+nr)>>1;
if(l<=mid)update(p<<1,l,r,nl,mid,x);
if(mid<r)update(p<<1|1,l,r,mid+1,nr,x);
t[p]=t[p<<1]+t[p<<1|1];t[p]%=mod;
}
void modify(int p,int l,int r,int nl,int nr,int x)
{
push_down(p,nl,nr);
if(l<=nl&&nr<=r)
{
d[p]*=x;d[p]%=mod;
t[p]*=x;t[p]%=mod;
return;
}
int mid=(nl+nr)>>1;
if(l<=mid)modify(p<<1,l,r,nl,mid,x);
if(mid<r)modify(p<<1|1,l,r,mid+1,nr,x);
t[p]=t[p<<1]+t[p<<1|1];t[p]%=mod;
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
cin>>n>>q>>mod;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--)
{
int op;cin>>op;
if(op==3)
{
int l,r;cin>>l>>r;
cout<<query(1,l,r,1,n)<<'\n';
}
else if(op==2)
{
int l,r,x;cin>>l>>r>>x;
update(1,l,r,1,n,x);
}
else{
int l,r,x;cin>>l>>r>>x;
modify(1,l,r,1,n,x);
}
}
return 0;
}