下面是代码:
#include<bits/stdc++.h>
using namespace std;
struct tree{
long long l,r;
long long sum,lazy_p,lazy_m;
}d[1000005];
long long n,m,mod;
long long a[1000005];
void build_tree(long long l,long long r,long long z){
d[z].l=l;
d[z].r=r;
d[z].lazy_m=1;
d[z].lazy_p=0;
if(l==r)
{
d[z].sum=a[l];
d[z].sum%=mod;
return;
}
long long mid=(d[z].l+d[z].r)/2;
build_tree(l,mid,z*2);
build_tree(mid+1,r,z*2+1);
d[z].sum=d[2*z].sum+d[2*z+1].sum;
d[z].sum%=mod;
}
void put_lazy(long long z){
if(d[z].lazy_m!=1)
{
d[z*2].sum*=d[z].lazy_m;
d[z*2+1].sum*=d[z].lazy_m;
d[z*2].sum%=mod;
d[z*2+1].sum%=mod;
d[z*2].lazy_m*=d[z].lazy_m;
d[z*2+1].lazy_m*=d[z].lazy_m;
d[z*2].lazy_m%=mod;
d[z*2+1].lazy_m%=mod;
d[z].lazy_m=1;
}
if(d[z].lazy_p)
{
d[z*2].sum+=d[z].lazy_p*(d[z*2].r-d[z*2].l+1);
d[z*2+1].sum+=d[z].lazy_p*(d[z*2+1].r-d[z*2+1].l+1);
d[z*2].sum%=mod;
d[z*2+1].sum%=mod;
d[z*2].lazy_p+=d[z].lazy_p;
d[z*2+1].lazy_p+=d[z].lazy_p;
d[z*2].lazy_p%=mod;
d[z*2+1].lazy_p%=mod;
d[z].lazy_p=0;
}
}
void mult_tree(long long x,long long y,long long z,long long k){
if(x<=d[z].l&&d[z].r<=y)
{
d[z].sum*=k;
d[z].lazy_p*=k;
d[z].lazy_m*=k;
d[z].lazy_m%=mod;
d[z].lazy_p%=mod;
d[z].sum%=mod;
return;
}
put_lazy(z);
long long mid=(d[z].l+d[z].r)/2;
if(x<=mid)
{
mult_tree(x,y,2*z,k);
}
if(y>mid)
{
mult_tree(x,y,2*z+1,k);
}
d[z].sum=d[2*z].sum+d[2*z+1].sum;
d[z].sum%=mod;
}
void plus_tree(long long x,long long y,long long z,long long k){
if(x<=d[z].l&&d[z].r<=y)
{
d[z].sum+=k*(d[z].r-d[z].l+1);
d[z].sum%=mod;
d[z].lazy_p+=k;
d[z].lazy_p%=mod;
return;
}
put_lazy(z);
long long mid=(d[z].l+d[z].r)/2;
if(x<=mid)
{
plus_tree(x,y,2*z,k);
}
if(y>mid)
{
plus_tree(x,y,2*z+1,k);
}
d[z].sum=d[2*z].sum+d[2*z+1].sum;
d[z].sum%=mod;
}
long long ask_tree(long long x,long long y,long long z){
if(x<=d[z].l&&d[z].r<=y)
{
return d[z].sum;
}
put_lazy(z);
long long mid=(d[z].l+d[z].r)/2,ans=0;
if(x<=mid)
{
ans+=ask_tree(x,y,2*z);
ans%=mod;
}
if(y>mid)
{
ans+=ask_tree(x,y,2*z+1);
ans%=mod;
}
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
cin>>n>>m>>mod;
long long i;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
build_tree(1,n,1);
while(m--)
{
long long op;
long long x,y;
cin>>op>>x>>y;
if(op==1)
{
long long k;
cin>>k;
mult_tree(x,y,1,k);
}
if(op==2)
{
long long k;
cin>>k;
plus_tree(x,y,1,k);
}
if(op==3)
{
cout<<ask_tree(x,y,1)%mod<<"\n";
}
}
return 0;
}