全(W)A
#include<bits/stdc++.h>
#define long long long
#define MAXN 4000001
using namespace std;
long n,m,r;
struct tree{
long l,r,s;
long p;
long u;
};
tree t[MAXN];
long a[MAXN];
void addtree(long k,long l,long r){
t[k].l=l;
t[k].r=r;
t[k].u=1;
if(l==r){
t[k].s=a[l]%r;
return;
}
long mid=((l+r)>>1);
addtree((k<<1),l,mid);
addtree((k<<1)+1,mid+1,r);
t[k].s=(t[(k<<1)].s+t[(k<<1)+1].s)%r;
return;
}
void fil(long k,long v,char op){
if(op=='*'){
t[k].s=t[k].s*v%r;
t[k].p=t[k].p*v%r;
t[k].u=t[k].u*v%r;
}else if(op=='+'){
t[k].s+=((t[k].r-t[k].l+1)*v)%r;
t[k].p=(t[k].p+v)%r;
}
}
void pushdown(long k){
long ls=(k<<1),rs=(k<<1)+1;
long u=t[k].u,p=t[k].p;
t[ls].s=(((t[ls].s*u%r)+(t[ls].r-t[ls].l+1)*p)%r)%r;
t[rs].s=(((t[rs].s*u%r)+(t[rs].r-t[rs].l+1)*p)%r)%r;
t[ls].u=t[ls].u*u%r;
t[rs].u=t[rs].u*u%r;
t[ls].p=(t[ls].p*u+p)%r;
t[rs].p=(t[rs].p*u+p)%r;
t[k].p=0;
t[k].u=1;
return;
}
void plu(long k,long x,long y,long z){
long l=t[k].l;
long r=t[k].r;
if(l>y||r<x)return;
if(l>=x&&r<=y){
fil(k,z,'+');
return;
}
pushdown(k);
if(t[(k<<1)].r>=x)plu((k<<1),x,y,z);
if(t[(k<<1)+1].l<=y)plu((k<<1)+1,x,y,z);
t[k].s=(t[(k<<1)].s+t[(k<<1)+1].s)%r;
return;
}
void mul(long k,long x,long y,long z){
long l=t[k].l;
long r=t[k].r;
if(l>y||r<x)return;
if(l>=x&&r<=y){
fil(k,z,'*');
return;
}
pushdown(k);
if(t[(k<<1)].r>=x)mul((k<<1),x,y,z);
if(t[(k<<1)+1].l<=y)mul((k<<1)+1,x,y,z);
t[k].s=(t[(k<<1)].s+t[(k<<1)+1].s)%r;
return;
}
long out(long k,long x,long y){
long l=t[k].l;
long r=t[k].r;
if(l>y||r<x)return 0;
if(l>=x&&r<=y)
return t[k].s;
pushdown(k);
long ans=0;
if(t[(k<<1)].r>=x)ans+=out((k<<1),x,y)%r;
if(t[(k<<1)+1].l<=y)ans+=out((k<<1)+1,x,y)%r;
return ans%r;
}
int main(){
cin>>n>>m>>r;
for(int i=1;i<=n;i++)
cin>>a[i];
addtree(1,1,n);
for(int i=1;i<=m;i++){
long op,x,y,z;
cin>>op>>x>>y;
if(op==1){
cin>>z;
z%=r;
mul(1,x,y,z);
}else if(op==2){
cin>>z;
z%=r;
plu(1,x,y,z);
}else{
cout<<out(1,x,y)<<endl;
}
}
return 0;
}
算是比较简洁了
求调QAQ