调了一下午了 真给跪了
#include <bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N=100000+50;
int n,Mod,a[N],m;
int opt;
struct node{
int sum,tag1,tag2;
#define sum(p) tr[p].sum
#define tag1(p) tr[p].tag1
#define tag2(p) tr[p].tag2
//tag1 -> mul
//tag2 -> add
}tr[N<<2];
inline void pushup(int p){sum(p)=(sum(p<<1)+sum(p<<1|1))%Mod;}
inline void add(int p,int l,int r,int v){
tag2(p)=(tag2(p)+v)%Mod;sum(p)=(sum(p)+v*(r-l+1)%Mod)%Mod;
return;
}
inline void mul(int p,int l,int r,int v){
tag1(p)=tag1(p)*v%Mod;sum(p)=(sum(p)*v%Mod)%Mod;tag2(p)=tag2(p)*v%Mod;
return;
}
inline void pushdown1(int p,int l,int r){
int mid=(l+r)>>1;
sum(p<<1)=(sum(p<<1)*tag1(p)%Mod+(mid-l+1)*tag2(p)%Mod)%Mod;
sum(p<<1|1)=(sum(p<<1|1)*tag1(p)%Mod+(r-mid)*tag2(p)%Mod)%Mod;
tag1(p<<1)=tag1(p<<1)*tag1(p)%Mod;
tag1(p<<1|1)=tag1(p<<1|1)*tag1(p)%Mod;
tag1(p)=1;
}
inline void pushdown2(int p,int l,int r){
//
int mid=(l+r)>>1;
sum(p<<1)=(sum(p<<1)*tag1(p)%Mod+tag2(p))%Mod;
sum(p<<1|1)=(sum(p<<1|1)*tag1(p)%Mod+tag2(p))%Mod;
//
tag2(p<<1)=(tag2(p<<1)*tag1(p)%Mod+tag2(p))%Mod;
tag2(p<<1|1)=(tag2(p<<1|1)*tag1(p)%Mod+tag2(p))%Mod;
tag2(p)=0;
}
inline void build(int p,int l,int r){
tag1(p)=1;tag2(p)=0;
if(l==r) sum(p)=a[l]%Mod;
int mid=(l+r)>>1;
cerr<<p<<' '<<sum(p)<<endl;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
// pushup(p);
sum(p)=(sum(p<<1)+sum(p<<1|1))%Mod;
return;
// cerr<<"---------------"<<endl;
}
inline void modify1(int p,int l,int r,int L,int R,int v){
if(l>=L&&r<=R) {mul(p,l,r,v);}
pushdown1(p,l,r);
pushdown2(p,l,r);
int mid=(l+r)>>1;
if(L<=mid) modify1(p<<1,l,mid,L,R,v);
if(R>mid) modify1(p<<1|1,mid+1,r,L,R,v);
pushup(p);
}
inline void modify2(int p,int l,int r,int L,int R,int v){
if(l>=L&&r<=R){add(p,l,r,v);}
pushdown1(p,l,r);
pushdown2(p,l,r);
int mid=(l+r)>>1;
if(L<=mid) modify2(p<<1,l,mid,L,R,v);
if(R>mid) modify2(p<<1|1,mid+1,r,L,R,v);
pushup(p);
}
inline ll query(int p,int l,int r,int L,int R){
if(l>=L&&r<=R) return sum(p);
int mid=(l+r)>>1;
pushdown1(p,l,r);
pushdown2(p,l,r);
ll res=0;
if(L<=mid) res+=query(p<<1,l,mid,L,R);
if(R>mid) res+=query(p<<1|1,mid+1,r,L,R);
return res;
}
inline int read(){
int cnt=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){cnt=(cnt<<1)+(cnt<<3)+(c^48);c=getchar();}
return cnt*f;
}
signed main(){
freopen("1.in","r",stdin);
n=read(),Mod=read();
for(int i=1;i<=n;++i) a[i]=read();
build(1,1,n);
m=read();int t,g,c;ll ans;
for(int i=1;i<=m;++i){
opt=read();
if(opt==1){t=read(),g=read(),c=read();modify1(1,1,n,t,g,c);}
if(opt==2){t=read(),g=read(),c=read();modify2(1,1,n,t,g,c);}
if(opt==3){t=read(),g=read();ans=(query(1,1,n,t,g)+Mod)%Mod;printf("%lld\n",ans);}
}
return 0;
}