#include <stdio.h>
#include <queue>
#include <algorithm>
#include <vector>
#include<set>
#include <string.h>
using namespace std;
int n,m,p;
struct node{
long long l,r,sum,mul_lz=1,add_lz=0;
}tree[500010];
int arr[100005];
void build(int id,int l,int r){
tree[id].l=l;
tree[id].r=r;
if(l==r){
tree[id].sum=arr[l];
return;
}
int mid=(l+r)>>1;
build(2*id,l,mid);
build(2*id+1,mid+1,r);
tree[id].sum=tree[2*id].sum+tree[2*id+1].sum;
}
void down(int id){
tree[id*2].sum=(tree[id*2].sum*tree[id].mul_lz+(tree[id*2].r-tree[id*2].l+1)*tree[id].add_lz)%p;
tree[id*2+1].sum=(tree[id*2+1].sum*tree[id].mul_lz+(tree[id*2+1].r-tree[id*2+1].l+1)*tree[id].add_lz)%p;
tree[id*2].mul_lz=(tree[id*2].mul_lz*tree[id].mul_lz)%p;
tree[id*2+1].mul_lz=(tree[id*2+1].mul_lz*tree[id].mul_lz)%p;
tree[id*2].add_lz=(tree[id*2].add_lz*tree[id].mul_lz+tree[id].add_lz)%p;
tree[id*2+1].add_lz=(tree[id*2+1].add_lz*tree[id].mul_lz+tree[id].add_lz)%p;
tree[id].add_lz=0;
tree[id].mul_lz=1;
}
void add(int id,int l,int r,int k){
if(tree[id].l>r||tree[id].r<l)return;
else if(tree[id].l>=l&&tree[id].r<=r){
tree[id].add_lz+=k;
tree[id].sum=(tree[id].sum+(tree[id].r-tree[id].l+1)*k)%p;
return;
}else
{if(tree[id].add_lz>0||tree[id].mul_lz>1)down(id);
add(id*2,l,r,k);
add(id*2+1,l,r,k);
tree[id].sum=(tree[id*2].sum+tree[id*2+1].sum)%p;
}
}
void mul(int id,int l,int r,int k){
if(tree[id].l>r||tree[id].r<l)return;
else if(tree[id].l>=l&&tree[id].r<=r){
tree[id].mul_lz=(k*tree[id].mul_lz)%p;
tree[id].add_lz=(k*tree[id].add_lz)%p;
tree[id].sum=(k*tree[id].sum)%p;
return;
}else
{if(tree[id].add_lz>0||tree[id].mul_lz>1)down(id);
mul(id*2,l,r,k);
mul(id*2+1,l,r,k);
tree[id].sum=(tree[id*2].sum+tree[id*2+1].sum)%p;
}
}
long long search(int id,int l,int r){
if(tree[id].l>r||tree[id].r<l)return 0;
else if(tree[id].l>=l&&tree[id].r<=r)return tree[id].sum;
else {
if(tree[id].add_lz>0||tree[id].mul_lz>1)down(id);
return (search(2*id,l,r)+search(2*id+1,l,r))%p;
}
}
int main(int argc, char const *argv[])
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++){
scanf("%d",&arr[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++){
int o,x,y,k;
scanf("%d",&o);
if(o==1){
scanf("%d%d%d",&x,&y,&k);
mul(1,x,y,k);
}else if(o==2){
scanf("%d%d%d",&x,&y,&k);
add(1,x,y,k);
}else{
scanf("%d%d",&x,&y);
printf("%lld\n",search(1,1,n));
}
}
return 0;
}