机房里人说我写的好
#include<bits/stdc++.h>
using namespace std;
#define tl (c<<1)
#define ty (c<<1|1)
#define int long long
int n,m,q,arr[110000];
struct Cy{
int l;
int r;
int len;
int sum;
int mu;
int tag;
}tr[110000<<2];
void build(int a,int b,int c){
tr[c].l=a,tr[c].r=b,tr[c].mu=1;
tr[c].len=b-a+1;
if(a==b){
tr[c].sum=arr[a];
return;
}
int mid=(a+b)>>1;
build(a,mid,tl);
build(mid+1,b,ty);
tr[c].sum=(tr[tl].sum+tr[ty].sum)%m;
}
int x,y,k;
void add(int c){
if(x<=tr[c].l&&tr[c].r<=y){
tr[c].sum+=k*tr[c].len%m;
tr[c].tag+=k%m;
return;
}
if(y<tr[c].l||tr[c].r<x){
return;
}
add(tl);
add(ty);
tr[c].sum=tr[tl].sum%m+tr[ty].sum%m;
return;
}
void cf(int c){
if(x<=tr[c].l&&tr[c].r<=y){
tr[c].sum*=k%m;
tr[c].tag*=k%m;
tr[c].mu*=k%m;
return;
}
if(y<tr[c].l||tr[c].r<x){
return;
}
cf(tl);
cf(ty);
tr[c].sum=(tr[tl].sum+tr[ty].sum)%m;
return;
}
void pushdown(int c){
tr[tl].sum*=tr[c].mu%m;
tr[ty].sum*=tr[c].mu%m;
tr[tl].sum+=tr[c].tag*tr[tl].len%m;
tr[ty].sum+=tr[c].tag*tr[ty].len%m;
tr[tl].tag=tr[tl].tag*tr[c].mu+tr[c].tag%m;
tr[ty].tag=tr[ty].tag*tr[c].mu+tr[c].tag%m;
tr[tl].mu*=tr[c].mu%m;
tr[ty].mu*=tr[c].mu%m;
tr[c].tag=0;
tr[c].mu=1;
return;
}
int query(int c){
if(x<=tr[c].l&&tr[c].r<=y){
return tr[c].sum%m;
}
if(y<tr[c].l||tr[c].r<x){
return 0;
}
pushdown(c);
int ret=0;
ret+=query(tl)%m;
ret+=query(ty)%m;
return ret%m;
}
signed main(){
cin>>n>>q>>m;
int op;
for(int i=1;i<=n;i++)cin>>arr[i],arr[i]%=m;
build(1,n,1);
for(int i=1;i<=q;i++){
// for(int i=1;i<=4*n;i++)cout<<tr[i].sum<<" ";
cin>>op>>x>>y;
if(op==1){
cin>>k;
cf(1);
}
else if(op==2){
cin>>k;
add(1);
}
else if(op==3){
int ans=query(1);
cout<<ans%m<<endl;
}
}
}