#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ma 114514
using namespace std;
ll read(){
char ch=getchar();
ll x=0,f=1;
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
ll mo;
ll n,m;
ll a[ma];
struct tree{
ll v,mu,ad;
}t[4*ma];
void build(ll p,ll l,ll r){
t[p].mu=1;
t[p].ad=0;
if(l==r){
t[p].v=a[l];
}
else{
ll mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].v=t[p*2].v+t[p*2+1].v;
}
t[p].v%=mo;
return;
}
void down(ll p,ll l,ll r){
ll mid=(l+r)/2;
t[p*2].v=(t[p*2].v*t[p].mu+t[p].ad*(mid-l+1))%mo;
t[p*2+1].v=(t[p*2+1].v*t[p].mu+t[p].ad*(r-mid))%mo;
t[p*2].mu=(t[p*2].mu*t[p].mu)%mo;
t[p*2+1].mu=(t[p*2+1].mu*t[p].mu)%mo;
t[p*2].ad=(t[p*2].ad*t[p].mu+t[p].ad)%mo;
t[p*2+1].ad=(t[p*2+1].ad*t[p].mu+t[p].ad)%mo;
t[p].mu=1;
t[p].ad=0;
return;
}
void updatemu(ll p,ll l,ll r,ll x,ll y,ll k){
if(y<l||r<x) return;
if(x<=l&&r<=y){
t[p].v=(t[p].v*k)%mo;
t[p].mu=(t[p].mu*k)%mo;
t[p].ad=(t[p].ad*k)&mo;
return;
}
down(p,l,r);
ll mid=(l+r)/2;
updatemu(p*2,l,mid,x,y,k);
updatemu(p*2+1,mid+1,r,x,y,k);
t[p].v=(t[p*2].v+t[p*2+1].v)%mo;
return;
}
void updatead(ll p,ll l,ll r,ll x,ll y,ll k){
if(y<l||r<x) return;
if(x<=l&&r<=y){
t[p].ad=(t[p].ad+k)%mo;
t[p].v=(t[p].v+k*(r-l+1))%mo;
return;
}
down(p,l,r);
ll mid=(l+r)/2;
updatead(p*2,l,mid,x,y,k);
updatead(p*2+1,mid+1,r,x,y,k);
t[p].v=(t[p*2].v+t[p*2+1].v)%mo;
return;
}
ll ask(ll p,ll l,ll r,ll x,ll y){
if(y<l||r<x) return 0;
if(x<=l&&r<=y){
return t[p].v;
}
down(p,l,r);
ll mid=(l+r)/2;
return (ask(p*2,l,mid,x,y)+ask(p*2+1,mid+1,r,x,y))%mo;
}
int main(){
n=read(),m=read(),mo=read();
for(ll i=1;i<=n;i++) a[i]=read();
build(1,1,n);
for(ll i=1;i<=m;i++){
ll op,x,y,k;
op=read();
if(op==1){
x=read(),y=read(),k=read();
updatemu(1,1,n,x,y,k);
}
else if(op==2){
x=read(),y=read(),k=read();
updatead(1,1,n,x,y,k);
}
else{
x=read(),y=read();
cout<<ask(1,1,n,x,y)%mo<<endl;
}
}
return 0;
}
救命,找半天了
能指出错误的话本人不胜感激