还有什么优化?
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,q,mod;
ll a[100086],rp[270086],b[270086],c[270086];
void build(int l,int r,int p){
c[p]=1;
if(l==r) {rp[p]=a[l];/**/return;}
int mid=l+r>>1;
build(l,mid,(p<<1)),build(mid+1,r,(p<<1)+1);
rp[p]=(rp[(p<<1)]+rp[(p<<1)+1])%mod;
}
void cd(int p,int l,int r){
int mid=l+r>>1;
c[(p<<1)]=(c[(p<<1)]*c[p])%mod;
c[(p<<1)+1]=(c[(p<<1)+1]*c[p]%mod);
b[(p<<1)]=(b[(p<<1)]*c[p]+b[p])%mod;
b[(p<<1)+1]=(b[(p<<1)+1]*c[p]+b[p])%mod;
rp[(p<<1)]=(rp[(p<<1)]*c[p]+b[p]*(mid-l+1))%mod;
rp[(p<<1)+1]=(rp[(p<<1)+1]*c[p]+b[p]*(r-mid))%mod;
c[p]=1;
b[p]=0;
return;
}
void add(int l,int r,int s,int t,int p,ll x){//[s,t]+x
if(s<=l&&t>=r) {b[p]=(b[p]+x)%mod,rp[p]=(rp[p]+x*(r-l+1))%mod;/**/return;}
cd(p,l,r);
int mid=l+r>>1;
if(s<=mid) add(l,mid,s,t,(p<<1),x);
if(t>mid) add(mid+1,r,s,t,(p<<1)+1,x);
rp[p]=(rp[(p<<1)]+rp[((p<<1))+1])%mod;
}
void mul(int l,int r,int s,int t,int p,ll x){//[s,t]*x
if(l==r){rp[p]=rp[p]*x%mod,c[p]=c[p]*x%mod,b[p]=b[p]*x%mod;/**/return;}
cd(p,l,r);
int mid=l+r>>1;
if(s<=mid) mul(l,mid,s,t,(p<<1),x);
if(t>mid) mul(mid+1,r,s,t,(p<<1)+1,x);
rp[p]=(rp[(p<<1)]+rp[(p<<1)+1])%mod;
}
ll getsum(int l,int r,int s,int t,int p){//sum[s,t]
if(s<=l&&t>=r) return rp[p];
int mid=l+r>>1;
cd(p,l,r);
ll tot=0;
if(s<=mid) tot+=getsum(l,mid,s,t,(p<<1));
if(t>mid) tot+=getsum(mid+1,r,s,t,(p<<1)+1);
return tot%mod;
}
int main() {
scanf("%d%d%d",&n,&q,&mod);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
build(1,n,1);
int c,l,r;
ll x;
for(int i=1;i<=q;++i){
scanf("%d",&c);
if(c==2){scanf("%d%d%lld",&l,&r,&x);/**/add(1,n,l,r,1,x);}
else if(c==1){scanf("%d%d%lld",&l,&r,&x);/**/mul(1,n,l,r,1,x);}
else{scanf("%d%d",&l,&r);/**/printf("%lld\n",getsum(1,n,l,r,1)%mod);}
}
return 0;
}