#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
const int N=100005;
int n,q,m;
int a[N],opt,x,y,k;
struct tree{
int l,r,adt,plt,v;
}t[N<<2];
void build(int now,int l,int r){
t[now].l=l;
t[now].r=r;
t[now].plt=1;
if(l==r){ t[now].v=a[l];return;}
int mid=(l+r)>>1;
build(now*2,l,mid);
build(now*2+1,mid+1,r);
t[now].v=t[now*2].v+t[now*2+1].v;
return;
}
void down(int now){
t[now*2].v=(t[now].plt*t[now*2].v+
((t[now*2].r-t[now*2].l+1)*t[now].adt)%k)%k;
t[now*2+1].v=(t[now].plt*t[now*2+1].v+
((t[now*2+1].r-t[now*2+1].l+1)*t[now].adt)%k)%k;
t[now*2].plt=t[now*2].plt*t[now].plt%k;
t[now*2+1].plt=t[now*2+1].plt*t[now].plt%k;
t[now*2].adt+=t[now].adt;
t[now*2].adt%=k;
t[now*2+1].adt+=t[now].adt;
t[now*2+1].adt%=k;
t[now].adt=0;
t[now].plt=1;
}
void pl(int l,int r,int k1,int now){
if(t[now].l>=l and t[now].r<=r){
t[now].adt=(t[now].adt*k1)%k;
t[now].plt=(t[now].plt*k1)%k;
t[now].v=t[now].v*k1%k;
return;
}
down(now);
int mid=(t[now].l+t[now].r)>>1;
if(l<=mid) pl(l,r,k1,now*2);
if(r>mid) pl(l,r,k1,now*2+1);
t[now].v=(t[now*2].v+t[now*2+1].v)%k;
return;
}
void ad(int l,int r,int k1,int now){
if(t[now].l>=l and t[now].r<=r){
t[now].adt=(t[now].adt+k1)%k;
t[now].v=
t[now].v+k1*(t[now].r-t[now].l+1)%k;
return;
}
down(now);
int mid=(t[now].l+t[now].r)>>1;
if(l<=mid) ad(l,r,k1,now*2);
if(r>mid) ad(l,r,k1,now*2+1);
t[now].v=(t[now*2].v+t[now*2+1].v)%k;
return;
}
int ask(int l,int r,int now){
if(t[now].l>=l and t[now].r<=r){
return t[now].v;
}
down(now);
int ans=0;
int mid=(t[now].l+t[now].r)>>1;
if(l<=mid) ans+=ask(l,r,now*2);
if(r>mid) ans+=ask(l,r,now*2+1);
return ans;
}
signed main(){
n=read();
m=read();
k=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
build(1,n,1);
for(int i=1;i<=m;i++){
opt=read(),x=read(),y=read();
if(opt==1){
k=read();
pl(x,y,k,1);
}else if(opt==2){
k=read();
ad(x,y,k,1);
}else{
ask(x,y,1);
}
}
return 0;
}