只是板子
#include<bits/stdc++.h>
using namespace std;
long long P;
long long n,m;
long long tr[400010],a[100010],lz[400010]={0},lz1[400010];
void build(long long p,long long l,long long r){
lz1[p]=1;
if(l==r){
tr[p]=a[l];
tr[p]%=P;
return;
}
long long mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
tr[p]=(tr[p*2]+tr[p*2+1])%P;
return;
}
/*void modify(long long p,long long l,long long r,long long pos,long long x){
if(l==r){
tr[p]=(tr[p]+x);
return;
}
long long mid=(l+r)/2;
if(pos<=mid) modify(p*2,l,mid,pos,x);
else modify(p*2+1,mid+1,r,pos,x);
tr[p]=(tr[p*2]+tr[p*2+1])%P;
}*/
void pushdown(long long p,long long l,long long r){
long long mid=(l+r)/2;
tr[p*2]=(tr[p*2]*lz1[p]+lz[p]*(mid-l+1))%P;
tr[p*2+1]=(tr[p*2+1]*lz1[p]+lz[p]*(r-mid))%P;
lz[p*2]=(lz[p*2]*lz1[p]+lz[p])%P;
lz[p*2+1]=(lz[p*2+1]*lz1[p]+lz[p])%P;
lz1[p*2]=(lz1[p*2]*lz1[p])%P;
lz1[p*2+1]=(lz1[p*2+1]*lz1[p])%P;
lz[p]=0;
lz1[p]=1;
return;
}
void modify_area(long long p,long long l,long long r,long long ml,long long mr,long long x){
if(mr<l||r<ml) return;
if(l>=ml&&r<=mr){
tr[p]=(tr[p]+x*(r-l+1))%P;
lz[p]=(lz[p]+x)%P;
return;
}
long long mid=(l+r)/2;
pushdown(p,l,r);
modify_area(p*2,l,mid,ml,mr,x);
modify_area(p*2+1,mid+1,r,ml,mr,x);
tr[p]=(tr[p*2]+tr[p*2+1])%P;
return;
}
void modify_area_multiplication(long long p,long long l,long long r,long long ml,long long mr,long long x){
if(mr<l||r<ml) return;
if(ml<=l&&r<=mr){
tr[p]=(tr[p]*x)%P;
lz[p]=(lz[p]*x)%P;
lz1[p]=(lz1[p]*x)%P;
return;
}
long long mid=(l+r)/2;
pushdown(p,l,r);
modify_area_multiplication(p*2,l,mid,ml,mr,x);
modify_area_multiplication(p*2+1,mid+1,r,ml,mr,x);
tr[p]=(tr[p*2]+tr[p*2+1])%P;
return;
}
long long query(long long p,long long l,long long r,long long ql,long long qr){
if(qr<l||r<ql) return 0;
if(l>=ql&&r<=qr){
return tr[p];
}
long long mid=(l+r)/2;
pushdown(p,l,r);
return (query(p*2,l,mid,ql,qr)+query(p*2+1,mid+1,r,ql,qr))%P;
}
int main(){
scanf("%lld%lld%lld",&n,&m,&P);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
for(long long i=1,u,ml,mr,x,ql,qr;i<=m;i++){
scanf("%lld",&u);
if(u==1){
scanf("%lld%lld%lld",&ml,&mr,&x);
modify_area_multiplication(1,1,n,ml,mr,x);
}
else if(u==2){
scanf("%lld%lld%lld",&ml,&mr,&x);
modify_area(1,1,n,ml,mr,x);
}
else if(u==3){
scanf("%lld%lld",&ql,&qr);
printf("%lld\n",query(1,1,n,ql,qr));
}
}
return 0;
}