是我数组开小了吗,还是哪里错了?
#include <bits/stdc++.h>
#define int long long
#define ls(x) (x<<1ll)
#define rs(x) (x<<1ll|1)
using namespace std;
int a[100001],sum[100001<<1ll];
int n,m,p,op,x,y,k;
inline void pushup(int x)
{
sum[x]=(sum[ls(x)]+sum[rs(x)])%p;
}
void build(int x,int l,int r)
{
if(l==r)
{
sum[x]=a[l];
return;
}
int mid=(l+r)>>1;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
pushup(x);
return;
}
void update(int l,int r,int x,int nl,int nr,int k)
{
if(nl>r||nr<l)
{
return;
}
if(nl==nr)
{
sum[x]=(sum[x]+k)%p;
return;
}
int mid=(nl+nr)>>1;
update(l,r,ls(x),nl,mid,k);
update(l,r,rs(x),mid+1,nr,k);
pushup(x);
return;
}
void update2(int l,int r,int x,int nl,int nr,int k)
{
if(nl>r||nr<l)
{
return;
}
if(nl==nr)
{
sum[x]=sum[x]*k%p;
return;
}
int mid=(nl+nr)>>1;
update2(l,r,ls(x),nl,mid,k);
update2(l,r,rs(x),mid+1,nr,k);
pushup(x);
return;
}
int query(int l,int r,int x,int nl,int nr)
{
if(nl>r||nr<l)
{
return 0;
}
if(nl>=l&&nr<=r)
{
return sum[x];
}
int mid=(nl+nr)>>1;
return (query(l,r,ls(x),nl,mid)+query(l,r,rs(x),mid+1,nr))%p;
}
#undef int
int main()
{
#define int long long
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
}
build(1,1,n);
for(int j=0;j<m;++j)
{
scanf("%lld%lld%lld",&op,&x,&y);
if(op!=3)
{
scanf("%lld",&k);
}
if(op==1)
{
update2(x,y,1,1,n,k);
}
else if(op==2)
{
update(x,y,1,1,n,k);
}
else
{
printf("%lld\n",query(x,y,1,1,n));
}
}
return 0;
}