#include<bits/stdc++.h>
#define id_l id<<1
#define id_r id<<1|1
#define MUL tree[id].lazy_mul
#define ADD tree[id].lazy_add
#define SUM tree[id].sum
#define mid (r+l>>1)
#define SUML tree[id_l].sum
#define SUMR tree[id_r].sum
#define MULL tree[id_l].lazy_mul
#define MULR tree[id_r].lazy_mul
#define ADDL tree[id_l].lazy_add
#define ADDR tree[id_r].lazy_add
#define int long long
using namespace std;
typedef long long LL;
const int MAXN=1e5+10;
struct node{
LL sum,lazy_add,lazy_mul;
}tree[MAXN<<2];
LL n,q,a[MAXN];
LL mod;
void pushup(int id){
SUM=(SUML+SUMR)%mod;
}
void build(int id,int l,int r){
MUL=1,ADD=0;
if(l==r){
tree[id].sum=a[l];
return;
}
build(id_l,l,mid);
build(id_r,mid+1,r);
pushup(id);
}
void pushdown(int id,int ll,int rr){
SUML=(SUML*MUL%mod+ll*ADD%mod)%mod;
SUMR=(SUMR*MUL%mod+rr*ADD%mod)%mod;
MULL*=MUL%mod;MULL%=mod;
MULR*=MUL%mod;MULR%=mod;
ADDL*=MUL,ADDR*=MUL,ADDL%=mod,ADDL%=mod;
ADDL+=ADD,ADDR+=ADD,ADDL%=mod,ADDR%=mod;
MUL=1,ADD=0;
}
void update1(int id,int l,int r,int L,int R,LL k){
if(l>=L&&r<=R){
SUM=(SUM+(r-l+1)*k)%mod;
ADD=(ADD+k)%mod;
return;
}
pushdown(id,mid-l+1,r-mid);
if(L<=mid)update1(id_l,l,mid,L,R,k);
if(R>mid)update1(id_r,mid+1,r,L,R,k);
pushup(id);
}
void update2(int id,int l,int r,int L,int R,LL k){
if(l>=L&&r<=R){
SUM=(SUM*k)%mod;
MUL*=k,MUL%=mod;
ADD*=k,ADD%=mod;
return;
}
pushdown(id,mid-l+1,r-mid);
if(L<=mid)update2(id_l,l,mid,L,R,k);
if(R>mid)update2(id,mid+1,r,L,R,k);
pushup(id);
}
LL query(int id,int l,int r,int L,int R){
if(l>=L&&r<=R)return SUM%mod;
pushdown(id,mid-l+1,r-mid);
LL res=0;
if(L<=mid)res+=query(id_l,l,mid,L,R)%mod;
if(R>mid) res+=query(id_r,mid+1,r,L,R)%mod;
return res%mod;
}
signed main(){
ios::sync_with_stdio(false);
scanf("%lld %lld %lld",&n,&q,&mod);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
int c,x,y;LL k;
build(1,1,n);
for(int i=1;i<=q;i++){
scanf("%lld",&c);
if(c==1){
scanf("%lld %lld %lld",&x,&y,&k);
update2(1,1,n,x,y,k);
}
else if(c==2){
scanf("%lld %lld %lld",&x,&y,&k);
update1(1,1,n,x,y,k);
}
else if(c==3) {
scanf("%lld %lld",&x,&y);
cout<<query(1,1,n,x,y)<<endl;
}
}
return 0;
}
样例没过,但已经对比题解一行行看了一下没看出哪里有问题,有没有大佬帮蒟蒻看一下