#include<iostream>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int a[maxn],n,m,mod;
struct SegmentTree{
int l,r;
int sum,add,mul;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define sum(x) tree[x].sum
#define add(x) tree[x].add
#define mul(x) tree[x].mul
}tree[maxn<<2];
inline void pushup(int p){
sum(p)=(sum(p<<1)+sum(p<<1|1))%mod;
}
inline void pushdown(int p){
if(add(p)||mul(p)!=1){
sum(p<<1)=((ll)sum(p<<1)*mul(p)+(r(p<<1)-l(p<<1)+1)*add(p))%mod;
sum(p<<1|1)=((ll)sum(p<<1|1)*mul(p)+(r(p<<1|1)-l(p<<1|1)+1)*add(p))%mod;
mul(p<<1)=((ll)mul(p<<1)*mul(p))%mod;
mul(p<<1|1)=((ll)mul(p<<1|1)*mul(p))%mod;
add(p<<1)=((ll)add(p<<1)*mul(p)+add(p))%mod;
add(p<<1|1)=((ll)add(p<<1|1)*mul(p)+add(p))%mod;
mul(p)=1,add(p)=0;
}
}
void build(int p,int l,int r){
l(p)=l,r(p)=r,mul(p)=1;
if(l==r){
sum(p)=a[l]%mod,add(p)=0;
return;
}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
void change1(int p,int l,int r,int c){
if(l<=l(p)&&r>=r(p)){
sum(p)=((ll)sum(p)*c)%mod;
add(p)=((ll)add(p)*c)%mod;
mul(p)=((ll)mul(p)*c)%mod;
return;
}
pushdown(p);
int mid=l(p)+r(p)>>1;
if(l<=mid) change1(p<<1,l,r,c);
if(r>mid) change1(p<<1|1,l,r,c);
pushup(p);
}
void change2(int p,int l,int r,int c){
if(l<=l(p)&&r>=r(p)){
sum(p)=((ll)sum(p)+(r(p)-l(p)+1)*c)%mod;
add(p)=(add(p)+c)%mod;
return;
}
pushdown(p);
int mid=l(p)+r(p)>>1;
if(l<=mid) change2(p<<1,l,r,c);
if(r>mid) change2(p<<1|1,l,r,c);
pushup(p);
}
int ask(int p,int l,int r){
if(l<=l(p)&&r>=r(p)) return sum(p);
pushdown(p);
int mid=l(p)+r(p)>>1;
int ans=0;
if(l<=mid) ans=(ans+ask(p<<1,l,r))%mod;
if(r>mid) ans=(ans+ask(p<<1|1,l,r))%mod;
return ans;
}
int main(){
scanf("%d%d",&n,&mod);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
scanf("%d",&m);
while(m--){
int opt,t,g,c;
scanf("%d%d%d",&opt,&t,&g);
switch(opt){
case 1:
scanf("%d",&c);
change1(1,t,g,c);
break;
case 2:
scanf("%d",&c);
change2(1,t,g,c);
break;
case 3:
printf("%d\n",ask(1,t,g));
}
}
return 0;
}
求助大佬,这错在哪里了,我调了好长时间也没做出来 /fad