代码如下,但不知道为什么0pts...(甚至样例都没过)
#include <bits/stdc++.h>
using namespace std;
long long n,m,p,a[100001],s[400001],t,ql,qr,k,tag[400001],mul[400001];
void create(long long o,long long l,long long r){
if(l==r){
s[o]=a[l];
return ;
}
long long m=(l+r)/2,lch=m*2,rch=lch+1;
create(lch,l,m);
create(rch,m+1,r);
s[o]=(s[lch]+s[rch])%p;
}
void fn(long long o,long long l,long long r){
long long m=(l+r)/2,lch=m*2,rch=lch+1;
s[lch]=(s[lch]*mul[o])%p;
s[rch]=(s[lch]*mul[o])%p;
s[lch]=(s[lch]+tag[o]*(m-l+1))%p;
s[rch]=(s[rch]+tag[o]*(r-m))%p;
mul[lch]=(mul[lch]*mul[o])%p;
mul[rch]=(mul[lch]*mul[o])%p;
tag[lch]=(tag[lch]*mul[o]+tag[o])%p;
tag[rch]=(tag[rch]*mul[o]+tag[o])%p;
mul[o]=1;
tag[o]=0;
}
long long find(long long o,long long l,long long r,long long ql,long long qr){
long long m=(l+r)/2,lch=m*2,rch=lch+1;
if(ql<=l && r<=qr) return s[o];
fn(o,l,r);
if(qr<=m) return find(lch,l,m,ql,qr);
if(ql>m) return find(rch,m+1,r,ql,qr);
return (find(lch,l,m,ql,qr)+find(rch,m+1,r,ql,qr))%p;
}
void add(long long o,long long l,long long r,long long ql,long long qr,long long k){
long long m=(l+r)/2,lch=m*2,rch=lch+1;
if(ql<=l && r<=qr){
tag[o]+=k;
s[o]+=k*(r-l+1);
return ;
}
fn(o,l,r);
if(qr<=m) add(lch,l,m,ql,qr,k);
else if(ql>m) add(rch,m+1,r,ql,qr,k);
else{add(lch,l,m,ql,qr,k); add(rch,m+1,r,ql,qr,k);}
s[o]=(s[lch]+s[rch])%p;
}
void mult(int o,int l,int r,int ql,int qr,int k){
long long m=(l+r)/2,lch=m*2,rch=lch+1;
if(ql<=l && r<=qr){
s[o]=(s[o]*k)%p;
mul[o]*=k;
return ;
}
fn(o,l,r);
if(qr<=m) mult(lch,l,m,ql,qr,k);
else if(ql>m) mult(rch,m+1,r,ql,qr,k);
else{mult(lch,l,m,ql,qr,k); mult(rch,m+1,r,ql,qr,k);}
s[o]=(s[lch]+s[rch])%p;
}
int main(){
for(int i=0;i<400001;i++){
mul[i]=1;
tag[i]=0;
}
scanf("%lld%lld%lld",&n,&m,&p);
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
create(1,1,n);
while(m--){
scanf("%lld%lld%lld",&t,&ql,&qr);
if(t==1){
scanf("%lld",&k);
mult(1,1,n,ql,qr,k);
}
if(t==2){
scanf("%lld",&k);
add(1,1,n,ql,qr,k);
}
if(t==3)
printf("%lld\n",find(1,1,n,ql,qr));
}
return 0;
}