找了半天不知道错在哪,求助:怎么找线段树题代码错在哪啊?
#include <bits/stdc++.h>
#define ls x<<1
#define rs x<<1|1
using namespace std;
inline int gin(){
char c=getchar();
int s=0,f=1;
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=(s<<3)+(s<<1)+(c^48);
c=getchar();
}
return s*f;
}
const int N=1e5+10;
int n,p,m,a[N];
struct node{
long long sum,ad,mu;
}t[N<<2];
void pushup(int x){
t[x].sum=(t[ls].sum+t[rs].sum)%p;
}
void build(int x,int l,int r){
t[x].mu=1;
if(l==1){
t[x].sum=a[l];
return;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(x);
}
void weihu(int x,int k){
t[ls].sum=(t[ls].sum*t[x].mu+t[x].ad*(k+1>>1))%p;
t[rs].sum=(t[rs].sum*t[x].mu+t[x].ad*(k>>1))%p;
t[ls].mu=t[ls].mu*t[x].mu%p;
t[rs].mu=t[rs].mu*t[x].mu%p;
t[ls].ad=(t[ls].ad*t[x].mu+t[x].ad)%p;
t[rs].ad=(t[rs].ad*t[x].mu+t[x].ad)%p;
t[x].mu=1,t[x].ad=0;
}
void multiply(int x,int l,int r,int L,int R,int c){
if(L<=l && r<=R){
t[x].mu=t[x].mu*c%p;
t[x].ad=t[x].ad*c%p;
t[x].sum=t[x].sum*c%p;
return;
}
weihu(x,r-l+1);
int mid=l+r>>1;
if(L<=mid)multiply(ls,l,mid,L,R,c);
if(R>mid)multiply(rs,mid+1,r,L,R,c);
pushup(x);
}
void add(int x,int l,int r,int L,int R,int c){
if(L<=l && r<=R){
t[x].ad=(t[x].ad+c)%p;
t[x].sum=(t[x].sum+(r-l+1)*c)%p;
return;
}
weihu(x,r-l+1);
int mid=l+r>>1;
if(L<=mid)add(ls,l,mid,L,R,c);
if(R>mid)add(rs,mid+1,r,L,R,c);
pushup(x);
}
long long ask(int x,int l,int r,int L,int R){
if(L<=l && r<=R)return t[x].sum;
weihu(x,r-l+1);
int mid=l+r>>1;
long long ans=0;
if(L<=mid)ans+=ask(ls,l,mid,L,R);
if(R>mid)ans+=ask(rs,mid+1,r,L,R);
ans=ans%p;
return ans;
}
int main(){
n=gin();p=gin();
for(int i=1;i<=n;i++)a[i]=gin();
build(1,1,n);
m=gin();
while(m--) {
int op=gin(),li=gin(),ri=gin();
if(op==1)multiply(1,1,n,li,ri,gin());
else if(op==2)add(1,1,n,li,ri,gin());
else printf("%lld\n",ask(1,1,n,li,ri));
}
return 0;
}