本人代码:
#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].mul*a[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].mul*a[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].mul*a[u].mul)%p;
a[u<<1|1].mul=(long long)(a[u<<1|1].mul*a[u].mul)%p;
a[u<<1].add=(long long)(a[u].mul*a[u<<1].add+a[u].add)%p;
a[u<<1|1].add=(long long)(a[u].mul*a[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].add*k)%p;
a[u].mul=(a[u].mul*k)%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;
}