#include<cstdio>
#include<algorithm>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')w=0,ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N=1e5+5;
const int M=2e6+5;
int n,mod,pri[9],tot,pw[9][M],q;
void exgcd(int a,int b,int &x,int &y){
if(!b){x=1,y=0;return;}
exgcd(b,a%b,y,x),y-=a/b*x;
}
int getinv(int a){
int x,y;exgcd(a,mod,x,y);return (x%mod+mod)%mod;
}
struct data{
int sum,s[9];
data(){
sum=0;
for(int i=0;i<tot;++i)s[i]=0;
}
data(int x){
if(!x){
for(int i=0;i<tot;++i)s[i]=M-1;
sum=0;
}else{
for(int i=0;i<tot;++i){
s[i]=0;
while(x%pri[i]==0)++s[i],x/=pri[i];
}
sum=x;
}
}
data inv(){
data c;c.sum=getinv(sum);
for(int i=0;i<tot;++i)c.s[i]=-s[i];
return c;
}
int val(){
int res=sum;
for(int i=0;i<tot;++i)res=1ll*res*pw[i][s[i]]%mod;
return res;
}
}t[N<<2],tag[N<<2];
data operator + (data a,data b){
data c;int s1=a.sum,s2=b.sum;
for(int i=0;i<tot;++i){
c.s[i]=min(a.s[i],b.s[i]);
s1=1ll*s1*pw[i][a.s[i]-c.s[i]]%mod;
s2=1ll*s2*pw[i][b.s[i]-c.s[i]]%mod;
}
c.sum=(s1+s2)%mod;return c;
}
data operator * (data a,data b){
data c;c.sum=1ll*a.sum*b.sum%mod;
for(int i=0;i<tot;++i)c.s[i]=a.s[i]+b.s[i];
return c;
}
void build(int x,int l,int r){
tag[x]=data(1);
if(l==r){t[x]=data(gi());return;}
int mid=l+r>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);
t[x]=t[x<<1]+t[x<<1|1];
}
void cover(int x,data v){
t[x]=t[x]*v;tag[x]=tag[x]*v;
}
void down(int x){
cover(x<<1,tag[x]);cover(x<<1|1,tag[x]);tag[x]=data(1);
}
void modify(int x,int l,int r,int ql,int qr,data v){
if(l>=ql&&r<=qr){cover(x,v);return;}
down(x);int mid=l+r>>1;
if(ql<=mid)modify(x<<1,l,mid,ql,qr,v);
if(qr>mid)modify(x<<1|1,mid+1,r,ql,qr,v);
t[x]=t[x<<1]+t[x<<1|1];
}
data query(int x,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr)return t[x];
down(x);int mid=l+r>>1;data res=data(0);
if(ql<=mid)res=res+query(x<<1,l,mid,ql,qr);
if(qr>mid)res=res+query(x<<1|1,mid+1,r,ql,qr);
return res;
}
int main(){
n=gi();mod=gi();int x=mod;
for(int i=2;i*i<=x;++i)
if(x%i==0){
pri[tot++]=i;
while(x%i==0)x/=i;
}
if(x>1)pri[tot++]=x;
for(int i=0;i<tot;++i)
for(int j=pw[i][0]=1;j<M;++j)
pw[i][j]=1ll*pw[i][j-1]*pri[i]%mod;
build(1,1,n);q=gi();while(q--){
int op=gi(),x=gi(),y=gi();
if(op==1)modify(1,1,n,x,y,data(gi()));
if(op==2)modify(1,1,n,x,x,data(y).inv());
if(op==3)printf("%d\n",query(1,1,n,x,y).val());
}
return 0;
}