#include<bits/stdc++.h> using namespace std; const int N=1e5+10; struct segtree{ int l,r; long long sum; int add,mul; }a[N<<2]; int data[N]; int n,m,p; void pushup(int u){ a[u].sum=(a[u<<1].sum+a[u<<1|1].sum)%p; } void build(int u,int l,int r){ a[u].l=l,a[u].r=r; a[u].add=0,a[u].mul=1; if(l==r){ a[u].sum=data[l]; return; } int mid=l+r>>1; build(u<<1,l,mid); build(u<<1|1,mid+1,r); pushup(u); } void pushdown(int u){ a[u<<1].sum=(long long)(a[u].mula[u<<1].sum+(a[u<<1].r-a[u<<1].l+1)a[u].add%p)%p; a[u<<1].sum=(long long)(a[u].mula[u<<1|1].sum+(a[u<<1|1].r-a[u<<1|1].l+1)a[u].add%p)%p; a[u<<1].mul=(long long)(a[u<<1].mula[u].mul)%p; a[u<<1|1].mul=(long long)(a[u<<1|1].mula[u].mul)%p; a[u<<1].add=(long long)(a[u].mula[u<<1].add+a[u].add)%p; a[u<<1|1].add=(long long)(a[u].mula[u<<1|1].add+a[u].add)%p; a[u].add=0,a[u].mul=1; } void update_add(int u,int l,int r,int k){ if(a[u].l>=l&&a[u].r<=r){ a[u].add=(a[u].add+k)%p; a[u].sum=(long long)(a[u].sum+k*(a[u].r-a[u].l+1))%p; return; } pushdown(u); pushup(u); int mid=a[u].l+a[u].r>>1; if(l<=mid)update_add(u<<1,l,r,k); if(mid<r)update_add(u<<1|1,l,r,k); pushup(u); } void update_mul(int u,int l,int r,int k){ if(a[u].l>=l&&a[u].r<=r){ a[u].add=(a[u].addk)%p; a[u].mul=(a[u].mulk)%p; a[u].sum=(a[u].sum*k)%p; return; } pushdown(u); pushup(u); int mid=a[u].l+a[u].r>>1; if(l<=mid)update_mul(u<<1,l,r,k); if(mid<r)update_mul(u<<1|1,l,r,k); pushup(u); } long long query(int u,int l,int r){ if(a[u].l>=l&&a[u].r<=r){ return a[u].sum; } long long ans=0; pushdown(u); int mid=a[u].l+a[u].r>>1; if(l<=mid)ans+=query(u<<1,l,r); if(mid<r)ans+=query(u<<1|1,l,r); return ans; } int op,e,f,c; int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++){
scanf("%d",&data[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&e,&f,&c);
update_mul(1,e,f,c);
}
if(op==2){
scanf("%d%d%d",&e,&f,&c);
update_add(1,e,f,c)```cpp
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; struct segtree{ int l,r; long long sum; int add,mul; }a[N<<2]; int data[N]; int n,m,p; void pushup(int u){ a[u].sum=(a[u<<1].sum+a[u<<1|1].sum)%p; } void build(int u,int l,int r){ a[u].l=l,a[u].r=r; a[u].add=0,a[u].mul=1; if(l==r){ a[u].sum=data[l]; return; } int mid=l+r>>1; build(u<<1,l,mid); build(u<<1|1,mid+1,r); pushup(u); } void pushdown(int u){ a[u<<1].sum=(long long)(a[u].mula[u<<1].sum+(a[u<<1].r-a[u<<1].l+1)a[u].add%p)%p; a[u<<1].sum=(long long)(a[u].mula[u<<1|1].sum+(a[u<<1|1].r-a[u<<1|1].l+1)a[u].add%p)%p; a[u<<1].mul=(long long)(a[u<<1].mula[u].mul)%p; a[u<<1|1].mul=(long long)(a[u<<1|1].mula[u].mul)%p; a[u<<1].add=(long long)(a[u].mula[u<<1].add+a[u].add)%p; a[u<<1|1].add=(long long)(a[u].mula[u<<1|1].add+a[u].add)%p; a[u].add=0,a[u].mul=1; } void update_add(int u,int l,int r,int k){ if(a[u].l>=l&&a[u].r<=r){ a[u].add=(a[u].add+k)%p; a[u].sum=(long long)(a[u].sum+k*(a[u].r-a[u].l+1))%p; return; } pushdown(u); pushup(u); int mid=a[u].l+a[u].r>>1; if(l<=mid)update_add(u<<1,l,r,k); if(mid<r)update_add(u<<1|1,l,r,k); pushup(u); } void update_mul(int u,int l,int r,int k){ if(a[u].l>=l&&a[u].r<=r){ a[u].add=(a[u].addk)%p; a[u].mul=(a[u].mulk)%p; a[u].sum=(a[u].sum*k)%p; return; } pushdown(u); pushup(u); int mid=a[u].l+a[u].r>>1; if(l<=mid)update_mul(u<<1,l,r,k); if(mid<r)update_mul(u<<1|1,l,r,k); pushup(u); } long long query(int u,int l,int r){ if(a[u].l>=l&&a[u].r<=r){ return a[u].sum; } long long ans=0; pushdown(u); int mid=a[u].l+a[u].r>>1; if(l<=mid)ans+=query(u<<1,l,r); if(mid<r)ans+=query(u<<1|1,l,r); return ans; } int op,e,f,c; int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++){
scanf("%d",&data[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&e,&f,&c);
update_mul(1,e,f,c);
}
if(op==2){
scanf("%d%d%d",&e,&f,&c);
update_add(1,e,f,c);
}
if(op==3){
scanf("%d%d",&e,&f);
printf("%lld\n",query(1,e,f));
}
}
return 0;
}
;
}
if(op==3){
scanf("%d%d",&e,&f);
printf("%lld\n",query(1,e,f));
}
}
return 0;
}