#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define mod 1000000007
#define pi (4*atan(1.0))
const int N=4e3+10,M=1e6+10,inf=1e9+10;
ll sum[M];
ll flagj[M];
ll flagc[M];
ll mul(ll x,ll y,ll mod)
{
x%=mod;
y%=mod;
return (x*y)%mod;
}
void pushdown(ll pos,ll len,ll mod)
{
ll lson=pos*2;
ll rson=pos*2+1;
flagj[lson]=(flagj[lson]*flagc[pos]+flagj[pos])%mod;
flagj[rson]=(flagj[rson]*flagc[pos]+flagj[pos])%mod;
flagc[lson]=(flagc[pos]*flagc[lson])%mod;
flagc[rson]=(flagc[pos]*flagc[rson])%mod;
sum[lson]=mul(len-(len>>1),flagj[pos],mod)+sum[lson]*flagc[pos];
sum[lson]%=mod;
sum[rson]=mul((len>>1),flagj[pos],mod)+sum[rson]*flagc[pos];
sum[rson]%=mod;
flagj[pos]=0;
flagc[pos]=1;
}
void buildtree(ll l,ll r,ll pos,ll mod)
{
flagc[pos]=1;
flagj[pos]=0;
if(l==r)
{
scanf("%lld",&sum[pos]);
sum[pos]%=mod;
return;
}
ll mid=(l+r)>>1;
buildtree(l,mid,pos*2,mod);
buildtree(mid+1,r,pos*2+1,mod);
sum[pos]=sum[pos*2]+sum[pos*2+1];
sum[pos]%=mod;
}
ll query(ll L,ll R,ll l,ll r,ll pos,ll mod)
{
if(L<=l&&r<=R)
return sum[pos]%mod;
pushdown(pos,(r-l+1),mod);
ll mid=(l+r)>>1;
ll ans=0;
if(L<=mid)ans+=query(L,R,l,mid,pos*2,mod);
if(mid<R)ans+=query(L,R,mid+1,r,pos*2+1,mod);
return ans%=mod;
}
void update(ll L,ll R,ll change,ll l,ll r,ll pos,ll flag,ll mod)
{
if(L<=l&&r<=R)
{
if(flag==1ll)
{
flagj[pos]*=change;
flagj[pos]%=mod;
flagc[pos]*=change;
flagc[pos]%=mod;
sum[pos]=mul(sum[pos],change,mod);
}
else
{
flagj[pos]+=change;
flagj[pos]%=mod;
sum[pos]+=mul(r-l+1,change,mod);
sum[pos]%=mod;
}
return;
}
pushdown(pos,r-l+1,mod);
ll mid=(l+r)/2;
if(L<=mid)update(L,R,change,l,mid,pos*2,flag,mod);
if(R>mid)update(L,R,change,mid+1,r,pos*2+1,flag,mod);
sum[pos]=sum[pos*2]+sum[pos*2+1];
sum[pos]%=mod;
}
int main()
{
ll x,y,z,i,t;
while(~scanf("%lld%lld",&x,&y))
{
buildtree(1,x,1,y);
ll q;
scanf("%lld",&q);
for(i=0;i<q;i++)
{
ll flag,l,r;
scanf("%lld%lld%lld",&flag,&l,&r);
if(flag==3ll)
{
printf("%lld\n",query(l,r,1,x,1,y));
}
else
{
ll c;
scanf("%lld",&c);
update(l,r,c,1,x,1,flag,y);
}
}
}
return 0;
}