#include<bits/stdc++.h>
using namespace std;
int n,m,mod;
struct Node
{
int l,r;
long long s,tag1,tag2;
}tree[400010];
int a[100010];
void build(int n,int l,int r)
{
tree[n].l=l;
tree[n].r=r;
tree[n].tag1=0;
tree[n].tag2=1;
if(l==r)
{
tree[n].s=a[l]%mod;
return;
}
build(n*2,l,(l+r)/2);
build(n*2+1,(l+r)/2+1,r);
tree[n].s=(tree[n*2].s+tree[n*2+1].s)%mod;
}
void pd(int n)
{
if(tree[n].tag1==0)
{
return;
}
int mid=(tree[n].l+tree[n].r)/2;
tree[2*n].s=(tree[2*n].s*tree[n].tag2+tree[n].tag1*(mid-tree[n].l+1))%mod;
tree[2*n].tag1=(tree[2*n].tag1*tree[n].tag2+tree[n].tag1)%mod;
tree[2*n].tag2*=tree[n].tag2;
tree[2*n].tag2%=mod;
tree[2*n+1].s=(tree[2*n+1].s*tree[n].tag2+tree[n].tag1*(tree[n].r-mid))%mod;
tree[2*n+1].tag1=(tree[2*n+1].tag1*tree[n].tag2+tree[n].tag1)%mod;
tree[2*n+1].tag2*=tree[n].tag2;
tree[2*n+1].tag2%=mod;
tree[n].tag1=0;
tree[n].tag2=1;
}
long long ask(int n,int l,int r)
{
int mid=(tree[n].l+tree[n].r)/2;
if(tree[n].l>=l&&tree[n].r<=r)
{
return tree[n].s;
}
pd(n);
long long ans=0;
if(mid>=l)
{
ans+=ask(n*2,l,r);
ans%=mod;
}
if(mid<r)
{
ans+=ask(n*2+1,l,r);
ans%=mod;
}
return ans;
}
void add(int n,int l,int r,long long k)
{
if(tree[n].l>=l&&tree[n].r<=r)
{
tree[n].s+=k*(tree[n].r-tree[n].l+1);
tree[n].s%=mod;
tree[n].tag1+=k;
tree[n].tag1%=mod;
return;
}
int mid=(tree[n].l+tree[n].r)/2;
pd(n);
if(mid>=l)
{
add(n*2,l,r,k);
}
if(mid<r)
{
add(n*2+1,l,r,k);
}
tree[n].s=(tree[n*2].s+tree[n*2+1].s)%mod;
}
void mul(int n,int l,int r,long long k)
{
if(tree[n].l>=l&&tree[n].r<=r)
{
tree[n].s=(tree[n].s*k)%mod;
tree[n].tag1*=k;
tree[n].tag1%=mod;
tree[n].tag2*=k;
tree[n].tag2%=mod;
return;
}
int mid=(tree[n].l+tree[n].r)/2;
pd(n);
if(mid>=l)
{
mul(n*2,l,r,k);
}
if(mid<r)
{
mul(n*2+1,l,r,k);
}
tree[n].s=(tree[n*2].s+tree[n*2+1].s)%mod;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>mod;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
while(m--)
{
int x;
cin>>x;
if(x==3)
{
int y,z;
cin>>y>>z;
cout<<ask(1,y,z)<<endl;
}
else if(x==2)
{
int y,z,k;
cin>>y>>z>>k;
add(1,y,z,k);
}
else
{
int y,z,k;
cin>>y>>z>>k;
mul(1,y,z,k);
}
}
}