#include<iostream>
#include<cstdio>
#define lson l,mid,k<<1
#define rson mid+1,r,k<<1|1
long long tree[500000],lazy[1000000],lazyC[1000000],n,m,Mod;
using namespace std;
void Push(long long k)
{
tree[k]=tree[k<<1]+tree[k<<1|1];
return;
}
void build(long long l,long long r,long long k)
{
// lazyC[k]=1;
if(l==r)
{
scanf("%lld",&tree[k]);
return;
}
long long mid=l+r>>1;
build(lson);
build(rson);
Push(k);
}
void pushdown(long long ln,long long rn,long long k)
{
// cout<<k<<" "<<lazyC[k]<<" "<<lazy[k]<<endl;
if(lazyC[k])
{
// cout<<lazyC[k]<<" "<<k<<endl;
tree[k<<1]+=ln*lazy[k]%Mod;//计算对两个子节点的影响
tree[k<<1|1]+=rn*lazy[k]%Mod;
tree[k<<1]*=lazyC[k]%Mod;
tree[k<<1|1]*=lazyC[k]%Mod;
// tree[k<<1]*=lazyC[k];
// tree[k<<1|1]*=lazyC[k];
// tree[k<<1]+=ln*lazy[k]*lazyC[k]%Mod;
// tree[k<<1|1]+=rn*lazy[k]*lazyC[k]%Mod;
lazy[k<<1]=(lazy[k<<1]*lazyC[k]+lazy[k]*ln*lazyC[k])%Mod;
lazy[k<<1|1]=(lazy[k<<1|1]*lazyC[k]+lazy[k]*rn*lazyC[k])%Mod;
if(lazyC[k<<1|1])lazyC[k<<1|1]*=lazyC[k]%Mod;
else lazyC[k<<1|1]+=lazyC[k]%Mod;
if(lazyC[k<<1])lazyC[k<<1]*=lazyC[k]%Mod;//把加法和乘法标记下放
else lazyC[k<<1]+=lazyC[k]%Mod;
lazyC[k]=0;
lazy[k]=0;
}
else
{
tree[k<<1]+=ln*lazy[k]%Mod;//计算对两个子节点的影响
tree[k<<1|1]+=rn*lazy[k]%Mod;
lazy[k<<1]+=lazy[k]%Mod;
lazy[k<<1|1]+=lazy[k]%Mod;
lazy[k]=0;
}
return;
}
void updateC(long long L,long long R,long long C,long long l,long long r,long long k)
{
if(l>=L&&r<=R)
{
// cout<<l<<" "<<r<<endl;
tree[k]=tree[k]*C%Mod;
// lazyC[k]+=C%Mod;
if(lazyC[k])lazyC[k]*=C%Mod;
else lazyC[k]+=C;
return;
}
long long mid=l+r>>1;
pushdown(mid-l+1,r-mid,k);
if(L<=mid)updateC(L,R,C,lson);
if(R>mid)updateC(L,R,C,rson);
Push(k);
}
void update(long long L,long long R,long long C,long long l,long long r,long long k)
{
if(l>=L&&r<=R)//如果修改范围只在L,R之间的话
{
tree[k]+=C*(r-l+1);
lazy[k]+=C;
return;
}
long long mid=l+r>>1;
pushdown(mid-l+1,r-mid,k);
if(L<=mid)update(L,R,C,lson);
if(R>mid)update(L,R,C,rson);
Push(k);
}
long long query(long long L,long long R,long long l,long long r,long long k)
{
if(l>=L&&r<=R)return tree[k];
long long mid=l+r>>1;
pushdown(mid-l+1,r-mid,k);
long long res=0;
if(L<=mid)res+=query(L,R,lson)%Mod;
if(R>mid)res+=query(L,R,rson)%Mod;
return res%Mod;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&Mod);
build(1,n,1);
long long t,x,y,z;
for(long long i=1;i<=m;i++)
{
scanf("%lld",&t);
if(t==1)
{
//cout<<100;
scanf("%lld%lld%lld",&x,&y,&z);
updateC(x,y,z,1,n,1);
}
if(t==3)
{
scanf("%lld%lld",&x,&y);
// res=0;
cout<<query(x,y,1,n,1)<<endl;
}
if(t==2)
{
//cout<<100;
scanf("%lld%lld%lld",&x,&y,&z);
update(x,y,z,1,n,1);
}
if(t==4)
{
int e;
scanf("%lld",&e);
cout<<lazy[e]<<" "<<lazyC[e]<<endl;
}
}
}
找不到错误