输出
20
25
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
struct node{
int l,r;ll sum;
ll mul,add;
}t[N<<4];
int n,m,p;
ll a[N];
inline void pd(int q){
t[q<<1].sum=(t[q<<1].sum*t[q].mul+t[q].add*(t[q<<1].r-t[q<<1].l+1))%p;
t[q<<1+1].sum=(t[q<<1+1].sum*t[q].mul+t[q].add*(t[q<<1+1].r-t[q<<1+1].l+1))%p;
t[q<<1].mul=(t[q<<1].mul*t[q].mul)%p;
t[q<<1+1].mul=(t[q<<1+1].mul*t[q].mul)%p;
t[q<<1].add=(t[q<<1].add*t[q].mul+t[q].add)%p;
t[q<<1+1].add=(t[q<<1+1].add*t[q].mul+t[q].add)%p;
t[q].add=0;t[q].mul=1;
}
inline void build(int q,int l,int r){
t[q].l=l;t[q].r=r;t[q].sum=0;t[q].add=0;t[q].mul=1;
if(l==r) {
t[q].sum=a[l]%p;return ;
}
int mid=(l+r)>>1;
build(q<<1,l,mid);
build(q<<1+1,mid+1,r);
t[q].sum=(t[q<<1].sum+t[q<<1+1].sum)%p;
}
inline void upmul(int q,int l,int r,int val){
if(t[q].l>r||t[q].r<l) return ;
if(t[q].l>=l&&t[q].r<=r){
t[q].add=(t[q].add*val)%p;
t[q].mul=(t[q].mul*val)%p;
t[q].sum=(t[q].sum*val)%p;
return ;
}
pd(q);
int mid=(t[q].l+t[q].r)>>1;
if(l<=mid) upmul(q<<1,l,r,val);
if(r>mid) upmul(q<<1+1,l,r,val);
t[q].sum=(t[q<<1].sum+t[q<<1+1].sum)%p;
}
inline void upadd(int q,int l,int r,int val){
if(t[q].l>r||t[q].r<l) return ;
if(t[q].l>=l&&t[q].r<=r){
t[q].add=(t[q].add+val)%p;
t[q].sum=(t[q].sum+val*(t[q].r-t[q].l+1))%p;
return ;
}
pd(q);
int mid=(t[q].l+t[q].r)>>1;
if(l<=mid) upadd(q<<1,l,r,val);
if(r>mid) upadd(q<<1+1,l,r,val);
t[q].sum=(t[q<<1].sum+t[q<<1+1].sum)%p;
}
ll query(int q,int l,int r){
if(t[q].r<l||t[q].l>r) return 0;
if(t[q].l>=l&&t[q].r<=r){
return t[q].sum;
}
pd(q);
ll val=0;
int mid=(t[q].l+t[q].r)>>1;
if(l<=mid) val+=query(q<<1,l,r);
if(r>mid) val+=query(q<<1+1,l,r);
return val;
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
int ch,x,y,k;
scanf("%d",&ch);
if(ch==1) scanf("%d%d%d",&x,&y,&k),upmul(1,x,y,k);
else if(ch==2) scanf("%d%d%d",&x,&y,&k),upadd(1,x,y,k);
else if(ch==3) {
scanf("%d%d",&x,&y);
ll ans=query(1,x,y)%p;
printf("%lld\n",ans);
}
}
return 0;
}