#include<bits/stdc++.h>
using namespace std;
long long p;
long long a[200000],tree[600000],laz[600000],lazz[600000];
void treemake(long long now,long long l,long long r){
if(l==r){
tree[now]=a[l]%p;
return;
}
int mid=(l+r)/2;
treemake(now*2,l,mid);
treemake(now*2+1,mid+1,r);
tree[now]=(tree[now*2]+tree[now*2+1])%p;
lazz[now]=1;
}
void pull(long long now,long long l,long long r){
if(!laz[now]&&lazz[now]==1) return;
int mid=(l+r)/2;
tree[now*2]=(tree[now*2]*lazz[now]+laz[now]*(mid-l+1))%p;
tree[now*2+1]=(tree[now*2+1]*lazz[now]+laz[now]*(r-mid))%p;
laz[now*2]=(laz[now*2]*lazz[now]+laz[now]);
laz[now*2+1]=(laz[now*2+1]*lazz[now]+laz[now]);
lazz[now*2]=(lazz[now*2]*lazz[now])%p;
lazz[now*2+1]*=(lazz[now*2+1]*lazz[now])%p;
laz[now]=0;
lazz[now]=1;
}
void t2(long long now,long long l,long long r,long long ll,long long rr,long long kkk){
if(ll<=l&&rr>=r){
laz[now]=(laz[now]+kkk)%p;
tree[now]=(tree[now]+kkk*(r-l+1))%p;
return;
}
pull(now,l,r);
long long mid=(l+r)/2;
if(ll<=mid) t2(now*2,l,mid,ll,rr,kkk);
if(rr>mid) t2(now*2+1,mid+1,r,ll,rr,kkk);
tree[now]=(tree[now*2]+tree[now*2+1])%p;
}
long long t3(long long now,long long l,long long r,long long ll,long long rr){
if(ll<=l&&rr>=r){
return tree[now];
}
pull(now,l,r);
long long mid=(l+r)/2,ans=0;
if(ll<=mid) ans+=t3(now*2,l,mid,ll,rr);
if(rr>mid) ans+=t3(now*2+1,mid+1,r,ll,rr);
return ans%p;
}
void t1(long long now,long long l,long long r,long long ll,long long rr,long long kkk){
if(ll<=l&&rr>=r){
laz[now]=(laz[now]*kkk)%p;
lazz[now]=(lazz[now]*kkk)%p;
tree[now]=(tree[now]*kkk)%p;
return;
}
pull(now,l,r);
long long mid=(l+r)/2;
if(ll<=mid) t1(now*2,l,mid,ll,rr,kkk);
if(rr>mid) t1(now*2+1,mid+1,r,ll,rr,kkk);
tree[now]=(tree[now*2]+tree[now*2+1])%p;
}
int main(){
int n,m;
cin>>n>>m>>p;
for(int i=1;i<=n;i++) cin>>a[i];
treemake(1,1,n);
while(m--){
long long ll,rr,k;
cin>>k>>ll>>rr;
if(k==1){
cin>>k;
t1(1,1,n,ll,rr,k);
}
else if(k==2){
cin>>k;
t2(1,1,n,ll,rr,k);
}
else cout<<t3(1,1,n,ll,rr)<<endl;
}
}
//t1 乘法
//t2 加法
//t3 求值
//laz 加法LAZZTAG
//lazz 乘法LAZZTAG
30分