#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e5+7;
const int M=1e5+7;
ll a[M],mod;
int n,m;
struct Tree{
int l,r;
ll sum,plz,mlz;
}tree[N];
void build(int x,int l,int r){
if(l==r){
tree[x].l=tree[x].r=l;
tree[x].sum=a[l]%mod;
tree[x].mlz=1;
return ;
}
int mid=l+(r-l)/2;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%mod;
tree[x].l=l,tree[x].r=r;
tree[x].mlz=1;
return ;
}
void push_down(int i){
ll k1=tree[i].mlz,k2=tree[i].plz;
int mid=tree[i].l+(tree[i].r-tree[i].l)/2;
tree[i<<1].sum=(tree[i<<1].sum*k1+(mid-tree[i].l+1)*k2)%mod;
tree[i<<1|1].sum=(tree[i<<1|1].sum*k1+(tree[i].r-mid)*k2)%mod;
tree[i<<1].mlz=tree[i<<1].mlz*k1%mod;
tree[i<<1|1].mlz=tree[i<<1|1].mlz*k1%mod;
tree[i<<1].plz=(tree[i<<1].plz*k1+k2)%mod;
tree[i<<1|1].plz=(tree[i<<1|1].plz*k1+k2)%mod;
tree[i].mlz=1;
tree[i].plz=0;
return ;
}
void add1(int x,int l,int r,int k){
if(tree[x].l>=l&&tree[x].r<=r){
tree[x].sum=tree[x].sum*k%mod;
tree[x].mlz=tree[x].mlz*k%mod;
tree[x].plz=tree[x].plz*k%mod;
return ;
}
push_down(x);
if(l<=tree[x<<1].r) add1(x<<1,l,r,k);
if(r>=tree[x<<1|1].l) add1(x<<1|1,l,r,k);
tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%mod;
return ;
}
void add2(int x,int l,int r,int k){
if(tree[x].l>=l&&tree[x].r<=r){
tree[x].sum+=(tree[x].r-tree[x].l+1)*k;
tree[x].plz+=k;
return ;
}
push_down(x);
if(l<=tree[x<<1].r) add2(x<<1,l,r,k);
if(r>=tree[x<<1|1].l) add2(x<<1|1,l,r,k);
tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%mod;
return ;
}
ll search(int x,int l,int r){
if(tree[x].l>=l&&tree[x].r<=r) return tree[x].sum;
if(tree[x].r<l||tree[x].l>r) return 0;
push_down(x);
ll k=0;
if(tree[x<<1].r>=l) k=(k+search(x<<1,l,r))%mod;
if(tree[x<<1|1].l<=r) k=(k+search(x<<1|1,l,r))%mod;
return k;
}
int main(){
scanf("%d %d %lld",&n,&m,&mod);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
int f,a,b;
while(m--){
scanf("%d",&f);
if(f==1){
scanf("%d %d %d",&a,&b,&f);
add1(1,a,b,f);
continue;
}
if(f==2){
scanf("%d %d %d",&a,&b,&f);
add2(1,a,b,f);
continue;
}
if(f==3){
scanf("%d %d",&a,&b);
cout<<search(1,a,b)<<endl;
}
}
return 0;
}