看程序找问题:
#include<iostream>
using namespace std;
const int maxn=1e5+1;
int n,q,m;
long long a[maxn];
#define lp p<<1
#define rp p<<1|1
struct SegTree{
struct node{
int l,r;
long long plz,mlz,val;
}tr[maxn<<2];
void pushdown(int p){
tr[lp].val=(tr[lp].val*tr[p].mlz)%m;
tr[rp].val=(tr[rp].val*tr[p].mlz)%m;
tr[lp].mlz=(tr[lp].mlz*tr[p].mlz)%m;
tr[rp].mlz=(tr[rp].mlz*tr[p].mlz)%m;
tr[lp].plz=(tr[lp].plz*tr[p].mlz)%m;
tr[rp].plz=(tr[rp].plz*tr[p].mlz)%m;
tr[lp].val=(tr[lp].val+tr[p].plz*(tr[lp].r-tr[lp].l+1))%m;
tr[rp].val=(tr[rp].val+tr[p].plz*(tr[rp].r-tr[rp].l+1))%m;
tr[lp].plz=(tr[lp].plz+tr[p].plz)%m;
tr[rp].plz=(tr[rp].plz+tr[p].plz)%m;
tr[p].mlz=1;
tr[p].plz=0;
}
void build(int p,int l,int r){
tr[p].l=l;
tr[p].r=r;
tr[p].plz=0;
tr[p].mlz=1;
if(l==r){
tr[p].val=a[l]%m;
return;
}
int mid=l+r>>1;
build(lp,l,mid);
build(rp,mid+1,r);
tr[p].val=(tr[lp].val+tr[rp].val)%m;
}
void updata1(int p,int l,int r,long long val){
if(tr[p].l>=l&&tr[p].r<=r){
tr[p].val=(tr[p].val+val*(tr[p].r-tr[p].l+1))%m;
tr[p].plz=(tr[p].plz+val)%m;
return;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(l<=mid) updata1(lp,l,r,val);
if(r>mid) updata1(rp,l,r,val);
tr[p].val=(tr[lp].val+tr[rp].val)%m;
}
void updata2(int p,int l,int r,long long val){
if(tr[p].l>=l&&tr[p].r<=r){
tr[p].val=(tr[p].val*val)%m;
tr[p].mlz=(tr[p].mlz*val)%m;
tr[p].plz=(tr[p].plz*val)%m;
return;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(l<=mid) updata2(lp,l,r,val);
if(r>mid) updata2(rp,l,r,val);
tr[p].val=(tr[lp].val+tr[rp].val)%m;
}
long long query(int p,int l,int r){
if(tr[p].l>=l&&tr[p].r<=r) return tr[p].val;
pushdown(p);
long long sum=0;
int mid=(tr[p].l+tr[p].r)>>1;
if(l<=mid) sum=(sum+query(lp,l,r))%m;
if(r>mid) sum=(sum+query(rp,l,r))%m;
return sum;
}
}seg;
#undef lp
#undef rp
int main(){
scanf("%d %d %d",&n,&q,&m);
for(int i=1;i<=n;i++) scanf("%lld",a+i);
seg.build(1,1,n);
for(int i=1,op,x,y;i<=q;i++){
scanf("%d",&op);
if(op==1){
long long k;
scanf("%d %d %lld",&x,&y,&k);
seg.updata1(1,x,y,k);
}
else if(op==2){
long long k;
scanf("%d %d %lld",&x,&y,&k);
seg.updata2(1,x,y,k);
}
else{
scanf("%d %d",&x,&y);
printf("%lld\n",seg.query(1,x,y));
}
}
return 0;
}
如果你也是这样写的,检查了半天没检查出问题,那恭喜你,你加法和乘法弄反了
(不会只有我眼瞎看错题吧)