调过了基础模板,现在开始调2了。。。。。。
#include <iostream>
using namespace std;
#define int __int128
inline void read(int &n){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
n=x*f;
}
inline void print(int n){
if(n<0){
putchar('-');
n*=-1;
}
if(n>9) print(n/10);
putchar(n % 10 + '0');
}
const int size=1e5+7;
int arr[size]={},sum[size],add[size],mul[size],bg[size],ed[size],n,m,p;
void build(int k,int lf,int rt){
bg[k]=lf,ed[k]=rt;
add[k]=0,mul[k]=1;
if(lf==rt) sum[k]=arr[lf];
else{
int mi=lf+(rt-lf)/2;
build(k*2,lf,mi),build(k*2+1,mi+1,rt);
sum[k]=sum[k*2]+sum[k*2+1];
}
sum[k]%=p;
}
void pudn(int k){
sum[k*2]=(sum[k*2]*mul[k]+(add[k]*(ed[k*2]-bg[k*2]+1))%p)%p;
sum[k*2+1]=(sum[k*2+1]*mul[k]+(add[k]*(ed[k*2+1]-bg[k*2+1]+1))%p)%p;
mul[k*2]=mul[k*2]*mul[k]%p,mul[k*2+1]=mul[k*2+1]*mul[k]%p;
add[k*2]=(add[k*2]*mul[k]+add[k])%p,add[k*2+1]=(add[k*2+1]*mul[k]+add[k])%p;
mul[k]=1,add[k]=0;
}
void modadd(int k,int cl,int cr,int cv){
if(cl<=bg[k]&&ed[k]<=cr){
add[k]=(add[k]+cv)%p;
sum[k]=(sum[k]+cv*(ed[k]-bg[k]+1))%p;
}else{
pudn(k);
sum[k]=(sum[k*2]+sum[k*2+1])%p;
if(cl<=ed[k*2]) modadd(k*2,cl,cr,cv);
if(bg[k*2+1]<cr) modadd(k*2+1,cl,cr,cv);
sum[k]=(sum[k*2]+sum[k*2+1])%p;
}
}
void modmul(int k,int cl,int cr,int cv){
if(cl<=bg[k]&&ed[k]<=cr) add[k]=add[k]*cv%p,mul[k]=mul[k]*cv%p,sum[k]=sum[k]*cv%p;
else{
pudn(k);
sum[k]=(sum[k*2]+sum[k*2+1])%p;
if(cl<=ed[k*2]) modadd(k*2,cl,cr,cv);
if(bg[k*2+1]<cr) modadd(k*2+1,cl,cr,cv);
sum[k]=(sum[k*2]+sum[k*2+1])%p;
}
}
int query(int k,int ql,int qr){
if(ql<=bg[k]&&ed[k]<=qr) return sum[k];
pudn(k);
int val=0;
if(ql<=ed[k*2]) val=(val+query(k*2,ql,qr))%p;
if(bg[k*2+1]<qr) val=(val+query(k*2+1,ql,qr))%p;
return val;
}
signed main(){
read(n),read(m),read(p);
for(int i=1;i<=n;i++) read(arr[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
int o,x,y,k;
read(o),read(x),read(y);
if(o==1) read(k),modmul(1,x,y,k);
else if(o==2) read(k),modadd(1,x,y,k);
else print(query(1,x,y)),putchar('\n');
}
return 0;
}