rt,附代码。虽然已经过了但是很疑惑。
#include<bits/stdc++.h>
using namespace std;
#define int __int128
inline int read(){
register int x=0,f=1,ch=getchar();
while(ch<'0'||ch>'9')f=(ch=='-'?-1:1),ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
inline void write(register int x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+48);
}
const int N=1e5+5;
int val[N<<2],add[N<<2],mul[N<<2],a[N],n,m,mod;
#define ls (p<<1)
#define rs (p<<1|1)
inline void pushup(int p){
val[p]=val[ls]+val[rs];
}
inline void build(int p,int l,int r){
mul[p]=1;
if(l==r){
val[p]=a[l]%mod;
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p);
}
inline void func(int p,int l,int r,int _mul,int _add){
val[p]=(val[p]*_mul%mod+(r-l+1)*_add%mod)%mod;
mul[p]=(mul[p]*_mul)%mod;
add[p]=(add[p]*_mul%mod+_add)%mod;
}
inline void pushdown(int p,int l,int r){
int mid=(l+r)>>1;
func(ls,l,mid,mul[p],add[p]);
func(rs,mid+1,r,mul[p],add[p]);
mul[p]=1,add[p]=0;
}
inline void Add(int p,int l,int r,int L,int R,int k){
if(L<=l&&r<=R){
val[p]=(val[p]+(r-l+1)*k%mod)%mod;
add[p]=(add[p]+k)%mod;
return;
}
int mid=(l+r)>>1;
pushdown(p,l,r);
if(L<=mid)Add(ls,l,mid,L,R,k);
if(R>mid)Add(rs,mid+1,r,L,R,k);
pushup(p);
}
inline void Mul(int p,int l,int r,int L,int R,int k){
if(L<=l&&r<=R){
val[p]=(val[p]*k)%mod;
mul[p]=(mul[p]*k)%mod;
add[p]=(add[p]*k)%mod;
return;
}
int mid=(l+r)>>1;
pushdown(p,l,r);
if(L<=mid)Mul(ls,l,mid,L,R,k);
if(R>mid)Mul(rs,mid+1,r,L,R,k);
pushup(p);
}
inline int query(int p,int l,int r,int L,int R){
if(L<=l&&r<=R)return val[p];
int mid=(l+r)>>1,res=0;
pushdown(p,l,r);
if(L<=mid)res=(res+query(ls,l,mid,L,R))%mod;
if(R>mid)res=(res+query(rs,mid+1,r,L,R))%mod;
return res;
}
signed main(){
n=read(),mod=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
m=read();
for(int i=1,op,l,r,k;i<=m;i++){
op=read();
if(op==1){
l=read(),r=read(),k=read();
Mul(1,1,n,l,r,k);
}
if(op==2){
l=read(),r=read(),k=read();
Add(1,1,n,l,r,k);
}
if(op==3){
l=read(),r=read();
write(query(1,1,n,l,r));
putchar('\n');
}
}
return 0;
}