#include<bits/stdc++.h>
using namespace std;
long long n,m,opt,x,y,k,mod,a[1000086];
struct t{
long long val,mul,add;
}tree[1000086*4];
void push_down(long long p,long long l,long long r){
long long mid=(l+r)>>1;
tree[p*2].val=(tree[p*2].val%mod*tree[p].mul%mod+tree[p].add%mod*(mid-l+1)%mod)%mod;
tree[p*2+1].val=(tree[p*2+1].val%mod*tree[p].mul%mod+tree[p].add%mod*(r-mid)%mod)%mod;
tree[p*2].mul=(tree[p*2].mul%mod*tree[p].mul%mod)%mod;
tree[p*2+1].mul=(tree[p*2+1].mul%mod*tree[p].mul%mod)%mod;
tree[p*2].add=(tree[p*2].add%mod*tree[p].mul%mod+tree[p].add%mod)%mod;
tree[p].mul=1,tree[p].add=0;
}
void build(long long l,long long r,long long p){
tree[p].add=0,tree[p].mul=1;
if(l==r){
tree[p].val=a[l]%mod;
}else{
long long mid=(l+r)>>1;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
tree[p].val=(tree[p*2].val%mod+tree[p*2+1].val%mod)%mod;
}
tree[p].val%=mod;
return;
}
//[cl,cr]是当前区间,[l,r]是目标区间
void add(long long l,long long r,long long cl,long long cr,long long p,long long d){
if(l>cr || r<cl) return;
if(l<=cl && r>=cr){
tree[p].val=(tree[p].val%mod+d%mod*(cr-cl+1)%mod)%mod;
tree[p].add=(tree[p].add%mod+d%mod)%mod;
return;
}
push_down(p,cl,cr);
long long mid=(cl+cr)>>1;
add(l,r,cl,mid,p*2,d);
add(l,r,mid+1,cr,p*2+1,d);
tree[p].val=(tree[p*2].val%mod+tree[p*2+1].val%mod)%mod;
return;
}
void mul(long long l,long long r,long long cl,long long cr,long long p,long long d){
if(l>cr || r<cl) return;
if(l<=cl && r>=cr){
tree[p].val=(tree[p].val*d)%mod;
tree[p].add=(tree[p].add*d)%mod;
tree[p].mul=(tree[p].mul*d)%mod;
return;
}
push_down(p,cl,cr);
long long mid=(cl+cr)>>1;
mul(l,r,cl,mid,p*2,d);
mul(l,r,mid+1,cr,p*2+1,d);
tree[p].val=(tree[p*2].val%mod+tree[p*2+1].val%mod)%mod;
return;
}
long long query(long long l,long long r,long long cl,long long cr,long long p){
if(cl>r || cr<l) return 0;
else if(cl>= l && cr<=r) return tree[p].val%mod;
else{
push_down(p,cl,cr);
long long mid=(cl+cr)>>1;
return (query(l,r,cl,mid,p*2)%mod+query(l,r,mid+1,cr,p*2+1)%mod)%mod;
}
}
int main(){
cin>>n>>m>>mod;
for(long long i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
for(long long i=1;i<=m;i++){
cin>>opt>>x>>y;
if(opt==1){
cin>>k;
mul(x,y,1,n,1,k);
}else if(opt==2){
cin>>k;
add(x,y,1,n,1,k);
}else
cout<<query(x,y,1,n,1)%mod<<endl;
}
return 0;
}
快自闭啦,请教大佬(鞠躬)