赏一关,爆零
#include<bits/stdc++.h>
using namespace std;
struct node
{
long long sum,add,num;
int l,r;
}tr[400040];
long long n,m,k,i,mod,t,q,op,j,x,y,a[100010];
bool pd;
void modd(int id)
{
tr[id].sum=(tr[id<<1].sum*tr[id<<1|1].sum)%mod;
return ;
}
void build(int id,int x,int y)
{
tr[id].l=x,tr[id].r=y,tr[id].num=1;
if(x==y)
{
tr[id].sum=a[x]%mod;
return ;
}
int mid=(x+y)>>1;
build(id<<1,x,mid);
build(id<<1|1,mid+1,y);
modd(id);
return ;
}
void wh(int id)
{
tr[id<<1].sum=(tr[id<< 1].sum * tr[id].num + tr[id].add * (tr[id << 1].r-tr[id << 1].l + 1)) % mod;
tr[id<<1|1].sum=(tr[id<< 1 | 1].sum *tr[id].num+tr[id].add *(tr[id<<1 | 1].r - tr[id << 1 | 1].l + 1)) % mod;
tr[id <<1].num = (tr[id << 1].num * tr[id].num) % mod;
tr[id<<1|1].num = (tr[id << 1 | 1].num * tr[id].num) % mod;
tr[id<<1].add = (tr[id << 1].add * tr[id].num + tr[id].add) % mod;
tr[id<<1|1].add = (tr[id << 1 | 1].add * tr[id].num + tr[id].add) % mod;
tr[id].add=0;
tr[id].num=1;
return ;
}
void xf(int id,int x,int y,int zax)
{
if(x<=tr[id].l && tr[id].r<=y)
{
tr[id].add=(tr[id].add*zax)%mod;
tr[id].num=(tr[id].num*zax)%mod;
tr[id].sum=(tr[id].sum*zax)%mod;
return ;
}
wh(id);
int mid=(tr[id].l+tr[id].r)/2;
if(x<=mid) xf(id<<1,x,y,zax);
else xf(id<<1|1,x,y,zax);
modd(id);
return ;
}
void jf(int id,int x,int y,int zax)
{
if(x<=tr[id].l && tr[id].r<=y)
{
tr[id].add=(tr[id].add+zax)%mod;
tr[id].sum=(tr[id].sum+zax*(tr[id].r-tr[id].l+1))%mod;
return ;
}
wh(id);
int mid=(tr[id].l+tr[id].r)/2;
if(x<=mid) jf(id<<1,x,y,zax);
else jf(id<<1|1,x,y,zax);
modd(id);
return ;
}
long long ask(int id,int x,int y)
{
if(x<=tr[id].l && tr[id].r<=y)
return tr[id].sum;
wh(id);
long long yt=0;
int mid=(tr[id].l+tr[id].r)/2;
if(x<=mid) yt=(yt+ask(id<<1,x,y))%mod;
else yt=(yt+ask(id<<1|1,x,y))%mod;
return yt;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>mod;
for(i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(i=1;i<=m;i++)
{
cin>>op>>x>>y;
if(op==1)
{
cin>>k;
xf(1,x,y,k);
}
if(op==2)
{
cin>>k;
jf(1,x,y,k);
}
if(op==3)
cout<<ask(1,x,y)<<"\n";
}
return 0;
}