#include <iostream>
 #include <cstdio>
 #define ll long long
 #define MAXN 100005
 using namespace std;
 ll ans[MAXN*4],a[MAXN],tagp[MAXN*4],tagm[MAXN*4];
 
 ll n,m,p;
 inline ll ls(ll f){return f<<1;}
 inline ll rs(ll f){return f<<1|1;}
 inline void push_up(int f){ans[f]=(ans[ls(f)]+ans[rs(f)])%p;}
 inline void build(ll l, ll r, ll f)
 {
   if(l==r)
   {
     ans[f]=a[l];
     return ;
   }
   ll mid=(l+r)>>1;
   build(l,mid,ls(f));
   build(mid+1,r,rs(f));
   push_up(f);
 }
 inline void cz(ll l, ll r, ll f, ll kp, ll km)
 {
   if(tagm[f]==0)tagm[f]=1;
   ans[f]=(ans[f]*km)%p;
   ans[f]=(ans[f]+kp*(r-l+1))%p;
   tagm[f]=(tagm[f]*km)%p;
   tagp[f]=(tagp[f]*km)%p;
   tagp[f]=(tagp[f]+kp)%p;
 }
 inline void push_down(ll l, ll r, ll f)
 {
   ll mid=(l+r)>>1;
   if(tagm[f]==0)tagm[f]=1;
   cz(l, mid, ls(f), tagp[f], tagm[f]);
   cz(mid+1, r, rs(f), tagp[f], tagm[f]);
   tagm[f]=1;
   tagp[f]=0;
 }
 inline void add(ll al, ll ar, ll l, ll r, ll f, ll k)
 {
   
   if(al<=l&&r<=ar)
   {
     tagp[f]+=k;
     ans[f]+=k*(r-l+1);
     return ;
   }
   if(tagm[f]==0)tagm[f]=1;
   
   if(tagp[f]!=0 || tagm[f]!=1)
     push_down(l,r,f);
     
   ll mid=(l+r)>>1;
   if(mid<ar)add(al,ar,mid+1,r,rs(f),k);
   if(al<=mid)add(al,ar,l,mid,ls(f),k);
   push_up(f);
 }
 inline void mult(ll ml, ll mr, ll l, ll r, ll f, ll k)
 {
   if(tagm[f]==0)tagm[f]=1;
   if(ml<=l&&r<=mr)
   {
     if(tagp[f]!=0)push_down(l,r,f);
     
     tagm[f]*=k;
     ans[f]*=k;
     return ;
   }
   if(tagp[f]!=0 || tagm[f]!=1)
     push_down(l,r,f);
   ll mid=(l+r)>>1;
   if(mid<mr)mult(ml,mr,mid+1,r,rs(f),k);
   if(ml<=mid)mult(ml,mr,l,mid,ls(f),k);
   push_up(f);
 }
 inline ll sum(ll sl, ll sr, ll l, ll r, ll f)
 {
   ll total=0;
   if(sl<=l&&r<=sr){return ans[f];}
   if(tagp[f]!=0)push_down(l,r,f);
   ll mid=(l+r)>>1;
   if(mid<sr)total+=sum(sl,sr,mid+1,r,rs(f));
   if(sl<=mid)total+=sum(sl,sr,l,mid,ls(f));
   return total%p;
 }
 int main()
 {
   
   cin >> n >> m >> p;
   for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
   build(1,n,1);
   ll cas,x,y,k;
   for(int cc=1;cc<=m;cc++)
   {
     scanf("%lld",&cas);
     switch(cas)
     {
       case 1:
       {
         scanf("%lld%lld%lld",&x,&y,&k);
         mult(x,y,1,n,1,k);
         break;
       }
       case 2:
       {
         scanf("%lld%lld%lld",&x,&y,&k);
         add(x,y,1,n,1,k);
         break;
       }
       case 3:
       {
         scanf("%lld%lld",&x,&y);
         cout << sum(x,y,1,n,1) <<endl;
         break;
       }
     }
   }
   
   return 0;
 }