输出结果恒为零
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005;
int n,m,PP;
int a[N],d[N*4],b1[N*4],b2[N*4];
int sum(int a,int b){
return (a+b)%PP;
}
int mul(int a,int b){
return (a*b)%PP;
}
void pushup(int p){
d[p]=sum(d[p*2],d[p*2+1]);
}
void pushdown(int p,int lenl,int lenr)
{
if(b1[p]!=1){
b1[p*2]=mul(b1[p*2],b1[p]);
b1[p*2+1]=mul(b1[p*2+1],b1[p]);
b2[p*2]=mul(b2[p*2],b1[p]);
b2[p*2+1]=mul(b2[p*2+1],b1[p]);
d[p*2]=mul(d[p*2],b1[p]);
d[p*2+1]=mul(d[p*2+1],b1[p]);
b1[p]=1;
}
if(b2[p])
{
b2[p*2]=sum(b2[p*2],b2[p]);
b2[p*2+1]=sum(b2[p*2+1],b2[p]);
d[p*2]=sum(d[p*2],b2[p]*lenl);
d[p*2+1]=sum(d[p*2+1],b2[p]*lenr);
b2[p]=0;
}
return ;
}
void build(int l,int r,int p)
{
if(l==r){
d[p]=a[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
pushup(p);
}
void update1(int l,int r,int ql,int qr,int k,int p)
{
if(ql<=l&&qr>=r){
d[p]=mul(d[p],k);
b1[p]=mul(b1[p],k);
b2[p]=mul(b2[p],k);
return ;
}
int mid=(l+r)/2;
pushdown(p,mid-l+1,r-mid);
if(mid<=l) update1(l,mid,ql,qr,k,p*2);
if(mid>r) update1(mid+1,r,ql,qr,k,p*2+1);
pushup(p);
}
void update2(int l,int r,int ql,int qr,int k,int p)
{
if(ql<=l&&qr>=r){
d[p]=sum(d[p],k*(r-l+1));
b2[p]=sum(b2[p],k);
return ;
}
int mid=(l+r)/2;
pushdown(p,mid-l+1,r-mid);
if(mid<=l) update2(l,mid,ql,qr,k,p*2);
if(mid>r) update2(mid+1,r,ql,qr,k,p*2+1);
pushup(p);
}
int ask(int l,int r,int ql,int qr,int p)
{
if(ql<=l&&qr>=r) return d[p];
int mid=(l+r)/2;
pushdown(p,mid-l+1,r-mid);
int ans=0;
if(mid<=l) ans=sum(ans,ask(l,mid,ql,qr,p*2));
if(mid>r) ans=sum(ans,ask(mid+1,r,ql,qr,p*2+1));
return ans;
}
signed main()
{
memset(b1,1,sizeof(b1));
cin>>n>>m>>PP;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
for(int i=1;i<=m;i++)
{
int op;
cin>>op;
if(op==1){
int x,y,k;
cin>>x>>y>>k;
update1(1,n,x,y,k,1);
}
else if(op==2){
int x,y,k;
cin>>x>>y>>k;
update2(1,n,x,y,k,1);
}
else if(op==3){
int x,y;
cin>>x>>y;
cout<<ask(1,n,x,y,1)<<endl;
}
}
for(int i=1;i<=4*n;i++)
cout<<d[i]<<endl;
return 0;
}