#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+2;
struct node{
int l,r;
long long sum,lz1,lz2;
} tmp[maxn*4];
int n,q,m;
int a[maxn];
void build(int now,int l,int r){
tmp[now].lz1=1;
tmp[now].l=l;
tmp[now].r=r;
if(l==r){
tmp[now].sum=a[l];
tmp[now].sum%=m;
return;
}
int mid=(l+r)/2;
build(2*now,l,mid);
build(2*now+1,mid+1,r);
tmp[now].sum=tmp[2*now].sum+tmp[2*now+1].sum;
tmp[now].sum%=m;
}
void pushdown(int now){
if(tmp[now].lz1==1&&tmp[now].lz2==0)return;
int mid=(tmp[now].l+tmp[now].r)/2;
tmp[now*2].sum=tmp[2*now].sum*tmp[now].lz1+tmp[now].lz2*(mid-tmp[now].l-1);
tmp[now*2].sum%=m;
tmp[now*2+1].sum=tmp[2*now+1].sum*tmp[now].lz1+tmp[now].lz2*(tmp[now].r-mid);
tmp[now*2+1].sum%=m;
tmp[now*2].lz1=tmp[now*2].lz1*tmp[now].lz1;
tmp[now*2].lz1%=m;
tmp[now*2+1].lz1=tmp[now*2+1].lz1*tmp[now].lz1;
tmp[now*2+1].lz1%=m;
tmp[now*2].lz2=tmp[now*2].lz2*tmp[now].lz1+tmp[now].lz2;
tmp[now*2].lz2%=m;
tmp[now*2+1].lz2=tmp[now*2+1].lz2*tmp[now].lz1+tmp[now].lz2;
tmp[now*2+1].lz2%=m;
tmp[now].lz1=1;
tmp[now].lz2=0;
return;
}
void mul(int now,int l,int r,int k){
if(tmp[now].l>=l&&tmp[now].r<=r){
tmp[now].sum*=k;
tmp[now].lz1+=k;
return;
}
pushdown(now);
int mid=(tmp[now].l+tmp[now].r)/2;
mul(now*2,l,mid,k);
mul(now*2+1,mid+1,r,k);
tmp[now].sum=tmp[now*2].sum+tmp[now*2+1].sum;
tmp[now].sum%=m;
return;
}
void add(int now,int l,int r,int k){
if(tmp[now].l>=l&&tmp[now].r<=r){
tmp[now].sum+=k*(tmp[now].r-tmp[now].l+1);
tmp[now].sum%=m;
tmp[now].lz2+=k;
return;
}
pushdown(now);
if(tmp[now*2].r>=l)add(now*2,l,r,k);
if(tmp[now*2+1].l<=r)add(now*2+1,l,r,k);
tmp[now].sum=tmp[now*2].sum+tmp[now*2+1].sum;
tmp[now].sum%=m;
}
long long check(int now,int l,int r){
if(tmp[now].r<l||tmp[now].l>r){
return 0;
}
if(l<=tmp[now].l&&tmp[now].r<=r){
return tmp[now].sum;
}
int mid=(tmp[now].l+tmp[now].r)/2;
long long w=0;
w+=check(now*2,l,mid);
w+=check(now*2+1,mid+1,r);
return w%m;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
int l,x,y,k;
for(int i=1;i<=q;i++){
cin>>l>>x>>y;
if(l==1){
cin>>k;
mul(1,x,y,k);
}else if(l==2){
cin>>k;
add(1,x,y,k);
}else{
cout<<check(1,x,y)<<"\n";
}
}
return 0;
}
首先,我承认这个码很丑陋
其次,它到底错哪里了( ๑ŏ ﹏ ŏ๑ )伤心