#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll tree1[100005],tree2[100005];
int lowbit(int x){return x&(-x);}
void update1(int x,int y){while(x<=100005){tree1[x]+=y;x+=lowbit(x);}}
void update2(int x,int y){while(x<=100005){tree2[x]+=y;x+=lowbit(x);}}
void c1(int x,int y){while(x<=100005){tree1[x]*=y;x*=lowbit(x);}}
void c2(int x,int y){while(x<=100005){tree2[x]*=y;x*=lowbit(x);}}
ll sum1(ll x){ll ans=0;while(x>0){ans+=tree1[x];x-=lowbit(x);}return ans;}
ll sum2(ll x){ll ans=0;while(x>0){ans+=tree2[x];x-=lowbit(x);}return ans;}
int main()
{
ll n,mod,m;
cin>>n>>m>>mod;
ll old=0,a;
for(int i=1;i<=n;i++)
{
cin>>a;
update1(i,a-old);
update2(i,(i-1)*(a-old));
old=a;
}
while(m--)
{
ll q,x,y,z;
cin>>q>>x>>y;
if(q==2)
{
cin>>z;
update1(x,z);
update1(y+1,-z);
update2(x,z*(x-1));
update2(y+1,-z*y);
}
if(q==1)
{
cin>>z;
c1(x,z);
c1(y+1,-z);
c2(x,z*(x-1));
c2(y+1,-z*y);
}
if(q==3)cout<<(y*sum1(y)-sum2(y)-(x-1)*sum1(x-1)+sum2(x-1))%mod<<endl;
}
return 0;
}