#include <iostream>
using namespace std;
const int N=1e6+5;
long long s[N],tree[4*N+5],add[4*N+5],mul[4*N+5],ad=0,sum;
long long p;
void pushup(int num,int l,int r)
{
add[num*2]+=add[num],add[num*2+1]+=add[num];
mul[num*2]*=mul[num],mul[num*2+1]*=mul[num];
tree[num]+=(r-l+1)*add[num],add[num]=0;
tree[num]*=mul[num],mul[num]=1;
tree[num]%=p;
add[num*2]%=p,add[num*2+1]%=p;
mul[num*2]%=p,mul[num*2+1]%=p;
return ;
}
void push(int num,int l,int r)
{
int mid=l+r>>1;
pushup(num*2,l,mid),pushup(num*2+1,mid+1,r);
pushup(num,l,r);
return ;
}
void build(int l,int r,int num)
{
mul[num]=1;
if(l==r)
{
tree[num]=s[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,num*2);
build(mid+1,r,num*2+1);
tree[num]=tree[num*2]+tree[num*2+1];
return ;
}
long long cheng(int l,int r,int num,int tl,int tr,int m)
{
long long sum=0;
push(num,l,r);
int mid=l+r>>1;
if(l==tl&&r==tr)
{
long long ad=tree[num];
mul[num]*=m;
push(num,l,r);
return ad*(m-1);
}
if(tl<=mid)//左边
sum+=cheng(l,mid,num*2,tl,min(mid,tr),m);
if(tr>=mid+1)//右边
sum+=cheng(mid+1,r,num*2+1,max(mid+1,tl),tr,m);
tree[num]+=sum;
tree[num]%=p;
return sum%p;
}
void adding(int l,int r,int num,int tl,int tr,int m)
{
push(num,l,r);
int mid=l+r>>1;
if(l==tl&&r==tr)
{
add[num]+=m;
push(num,l,r);
return ;
}
if(tl<=mid)//左边
adding(l,mid,num*2,tl,min(mid,tr),m);
if(tr>=mid+1)//右边
adding(mid+1,r,num*2+1,max(mid+1,tl),tr,m);
tree[num]+=(tr-tl+1)*m;
tree[num]%=p;
return ;
}
long long getans(int l,int r,int num,int tl,int tr)
{
long long sum=0;
push(num,l,r);
if(l==tl&&r==tr)
{
tree[num]%=p;
return tree[num];
}
int mid=l+r>>1;
if(tl<=mid)//左边
sum+=getans(l,mid,num*2,tl,min(mid,tr));
if(tr>=mid+1)//右边
sum+=getans(mid+1,r,num*2+1,max(mid+1,tl),tr);
return sum%p;
}
int main()
{
int n,m,c,x,y,k;
cin>>n>>m>>p;
for(int i=1;i<=n;++i)
cin>>s[i];
build(1,n,1);
while(m--)
{
cin>>c>>x>>y;
if(c==1)
{
cin>>k;
cheng(1,n,1,x,y,k);
}
else if(c==2)
{
cin>>k;
adding(1,n,1,x,y,k);
}
else
cout<<getans(1,n,1,x,y)%p<<endl;
}
}
我也不知道哪里有问题。
绝望