#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+10;
const int M = sqrt(1e7+10);
int n,q,m,op,x,y,k;
int a[N],belong[N],len,num;
struct node{
int l,r,sum,add,mul;
}b[M];
void build(){
num=sqrt(n);
len=sqrt(n);
for(int i=1;i<=num;i++){
b[i].l=(i-1)*len+1,b[i].r=i*len;
}
if(len*num<n){
num++;
b[num].l=b[num-1].r+1;
b[num].r=n;
}
for(int i=1;i<=num;i++){
for(int j=b[i].l;j<=b[i].r;j++){
b[i].sum+=a[j];
belong[j]=i;
}
}
for(int i=1;i<=num;i++) b[i].mul=1;
}
void update_1(int x,int y,int k){
int p=belong[x],q=belong[y];
if(p==q){
for(int i=x;i<=y;i++){
b[p].sum+=(k-1)*a[i];b[p].sum%=m;
a[i]*=k;a[i]%=m;
}
}else{
for(int i=x;i<=b[p].r;i++){
b[p].sum+=(k-1)*a[i];b[p].sum%=m;
a[i]*=k;a[i]%=m;
}
for(int i=p+1;i<q;i++){
b[i].sum*=k;b[i].add*=k,b[i].mul+=k;
}
for(int i=b[q].l;i<=y;i++){
b[q].sum+=(k-1)*a[i];b[q].sum%=m;
a[i]*=k;a[i]%=m;
}
}
}
void update_2(int x,int y,int k){
int p=belong[x],q=belong[y];
if(p==q){
for(int i=x;i<=y;i++){
a[i]+=k;b[i].sum+=k;
a[i]%=m;b[i].sum%=m;
}
}else{
for(int i=x;i<=b[p].r;i++){
a[i]+=k;b[p].sum+=k;
a[i]%=m;b[p].sum%=m;
}
for(int i=p+1;i<q;i++){
b[i].sum+=len*k,b[i].add+=k;
b[i].sum%=m,b[i].add%=m;
}
for(int i=b[q].l;i<=y;i++){
a[i]+=k;b[q].sum+=k;
a[i]%=m;b[q].sum%=m;
}
}
}
int getsum(int x,int y){
int p=belong[x],q=belong[y],ans=0;
if(p==q){
for(int i=x;i<=y;i++){
ans+=(a[i]*b[p].mul)%m+b[p].add;
ans%=m;
}
return ans;
}else{
for(int i=x;i<=b[p].r;i++){
ans+=(a[i]*b[p].mul)%m+b[p].add;
ans%=m;
}
for(int i=p+1;i<q;i++){
ans+=b[i].sum;
ans%=m;
}
for(int i=b[q].l;i<=y;i++){
ans+=(a[i]*b[q].mul)%m+b[p].add;
ans%=m;
}
return ans;
}
}
signed main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build();
while(q--){
cin>>op>>x>>y;
if(op==1){
cin>>k;
update_1(x,y,k);
}else{
if(op==2){
cin>>k;
update_2(x,y,k);
}else{
cout<<getsum(x,y)<<endl;
}
}
}
return 0;
}