#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
long long n,p,m,a[N];
long long sum[N*4],add[N*4][3];
inline long long read(){
long long x=0;char ch;
while((ch=getchar())<'0'||ch>'9'){
ch=getchar();
}
x=ch-'0';
while((ch=getchar())>='0'&&ch<='9'){
x=x*10+ch-'0';
}
return x;
}
void build(int k,int l,int r){
add[k][1]=1;
if(l==r){
sum[k]=a[l]%p;
return ;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
sum[k]=(sum[k<<1]+sum[k<<1|1])%p;
}
void Add(int k,int l,int r,int z,long long v){
if(z==1){
sum[k]=(sum[k]*v)%p;
}else if(z==2){
sum[k]=(sum[k]%p+(r-l+1)*1ll*v%p)%p;
}
}
void pushdown(int k,int l,int r,int mid){
if(add[k][1]>1){
Add(k<<1,l,mid,1,add[k][1]);
Add(k<<1|1,mid+1,r,1,add[k][1]);
add[k][1]=1;
}
if(add[k][2]>0){
Add(k<<1,l,mid,2,add[k][2]);
Add(k<<1|1,mid+1,r,2,add[k][2]);
add[k][2]=0;
}
sum[k]=(sum[k<<1]+sum[k<<1|1])%p;
}
void modify(int k,int l,int r,int x,int y,long long v,int z){
if(l>=x&&r<=y){
if(z==1){
add[k][1]=(add[k][1]*v)%p;
add[k][2]=(add[k][2]*v)%p;
}else if(z==2){
add[k][2]=(add[k][2]+v)%p;
}
Add(k,l,r,z,v);
return ;
}
int mid=l+r>>1;
pushdown(k,l,r,mid);
if(x<=mid)modify(k<<1,l,mid,x,y,v,z);
if(y>mid)modify(k<<1|1,mid+1,r,x,y,v,z);
sum[k]=(sum[k<<1]+sum[k<<1|1])%p;
}
long long query(int k,int l,int r,int x,int y){
if(l>=x&&r<=y)return sum[k]%p;
int mid=l+r>>1;
long long res=0;
pushdown(k,l,r,mid);
if(x<=mid)res+=query(k<<1,l,mid,x,y);
res%=p;
if(y>mid)res+=query(k<<1|1,mid+1,r,x,y);
return res%p;
}
int main(){
n=read();p=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
m=read();
while(m--){
long long k,t,g,c;
k=read();t=read();g=read();
if(k==1){
c=read();
modify(1,1,n,t,g,c,1);
}else if(k==2){
c=read();
modify(1,1,n,t,g,c,2);
}else if(k==3){
printf("%lld\n",query(1,1,n,t,g)%p);
}
}
return 0;
}