#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
struct data{
LL mul,add;
};
data lazy[500005];
LL n,p;
LL v[500005],a[500005];
LL ls(LL x){return x<<1LL;}
LL rs(LL x){return x<<1LL|1LL;}
void push_up(LL x){
v[x]=(v[ls(x)]+v[rs(x)])%p;
}
void build(LL l,LL r,LL x){
lazy[x].mul=1LL;
lazy[x].add=0LL;
if(l==r){
v[x]=a[l]%p;
return;
}
LL mid=(l+r)>>1;
build(l,mid,ls(x));
build(mid+1,r,rs(x));
push_up(x);
v[x]=v[x]%p;
}
void push_down(LL l,LL r,LL x){
LL mid=(l+r)>>1LL;
v[ls(x)]=(1LL*v[ls(x)]*lazy[x].mul%p+1LL*lazy[x].add*(l-mid+1)%p)%p;
v[rs(x)]=(1LL*v[rs(x)]*lazy[x].mul%p+1LL*lazy[x].add*(r-mid)%p)%p;
lazy[ls(x)].mul=(1LL*lazy[ls(x)].mul%p*lazy[x].mul)%p;
lazy[rs(x)].mul=(1LL*lazy[rs(x)].mul%p*lazy[x].mul)%p;
lazy[ls(x)].add=(1LL*lazy[ls(x)].add%p*lazy[x].mul%p+lazy[x].add)%p;
lazy[rs(x)].add=(1LL*lazy[rs(x)].add%p*lazy[x].mul%p+lazy[x].add)%p;
lazy[x].mul=1LL;
lazy[x].add=0LL;
}
void modify1(LL l,LL r,LL ql,LL qr,LL x,LL k){
if(l>qr||r<ql) return;
if(ql<=l&&qr>=r){
lazy[x].add=(1LL*lazy[x].add*k)%p;
lazy[x].mul=(1LL*lazy[x].mul*k)%p;
v[x]=(1LL*v[x]*k)%p;
return;
}
push_down(l,r,x);
LL mid=(l+r)>>1LL;
modify1(l,mid,ql,qr,ls(x),k);
modify1(mid+1,r,ql,qr,rs(x),k);
push_up(x);
v[x]=v[x]%p;
}
void modify2(LL l,LL r,LL ql,LL qr,LL x,LL k){
if(ql<=l&&r<=qr){
lazy[x].add=(lazy[x].add+k%p)%p;
v[x]=(v[x]%p+1LL*(r-l+1LL)*k%p)%p;
//push_down(l,r,x);
return;
}
push_down(l,r,x);
LL mid=(l+r)>>1LL;
if(ql<=mid) modify2(l,mid,ql,qr,ls(x),k);
if(mid<qr) modify2(mid+1LL,r,ql,qr,rs(x),k);
push_up(x);
v[x]=v[x]%p;
}
LL query(LL l,LL r,LL ql,LL qr,LL x){
if(l>qr||r<ql) return 0LL;
if(ql<=l&&r<=qr){
return v[x]%p;
}
push_down(l,r,x);
LL mid=(l+r)>>1LL;
LL res=(query(l,mid,ql,qr,ls(x))%p+query(mid+1,r,ql,qr,rs(x))%p)%p;
return res;
}
int main(){
LL m;
scanf("%lld%lld%lld",&n,&m,&p);
for(LL i=1LL;i<=n;i++) scanf("%lld",&a[i]);
build(1LL,n,1LL);
//print();
for(LL i=1LL;i<=m;i++){
LL a,b,c,d;
scanf("%lld",&a);
if(a==1LL){
scanf("%lld%lld%lld",&b,&c,&d);
modify1(1LL,n,b,c,1LL,d);
}
if(a==2LL){
scanf("%lld%lld%lld",&b,&c,&d);
modify2(1LL,n,b,c,1LL,d);
}
if(a==3LL){
scanf("%lld%lld",&b,&c);
LL ans=query(1LL,n,b,c,1LL);
printf("%lld\n",ans);
}
}
return 0;
}
我已经快调废了