RT,看了很久也看不出来哪里错了,求助!
#include<iostream>
using namespace std;
#define MAXN 100005
int n,m,p,a[MAXN];
struct node{
int val,add,mul,l,r;
}tree[4*MAXN];
void pushdown(int i){
tree[i*2].val=(tree[i*2].val*tree[i].mul+tree[i].add*(tree[i*2].r-tree[i*2].l+1))%p;
tree[i*2+1].val=(tree[i*2+1].val*tree[i].mul+tree[i].add*(tree[i*2+1].r-tree[i*2+1].l+1))%p;
tree[i*2].add=(tree[i*2].add*tree[i].mul+tree[i].add)%p;
tree[i*2+1].add=(tree[i*2+1].add*tree[i].mul+tree[i].add)%p;
tree[i*2].mul=(tree[i*2].mul*tree[i].mul)%p;
tree[i*2+1].mul=(tree[i*2+1].mul*tree[i].mul)%p;
tree[i].add=0;
tree[i].mul=1;
return;
}
int sum(int i,int l,int r){
if(tree[i].l>=l&&tree[i].r<=r)
return tree[i].val;
pushdown(i);
int mid=(tree[i].l+tree[i].r)>>1,res=0;
if(mid>=l)
res+=sum(i*2,l,r);
res%=p;
if(mid+1<=r)
res+=sum(i*2+1,l,r);
res%=p;
return res;
}
void build(int i,int l,int r){
tree[i].add=0,tree[i].mul=1;
tree[i].l=l,tree[i].r=r;
if(l==r){
tree[i].val=a[l];
return;
}
int mid=(l+r)>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tree[i].val=(tree[i*2].val+tree[i*2+1].val)%p;
return;
}
void update1(int i,int l,int r,int k){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].add=(tree[i].add*k)%p;
tree[i].mul=(tree[i].mul*k)%p;
tree[i].val=(tree[i].val*k)%p;
return;
}
pushdown(i);
int mid=(tree[i].l+tree[i].r)>>1;
if(mid>=l)
update1(i*2,l,r,k);
if(mid+1<=r)
update1(i*2+1,l,r,k);
tree[i].val=(tree[i*2].val+tree[i*2+1].val)%p;
return;
}
void update2(int i,int l,int r,int k){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].add=(tree[i].add+k)%p;
tree[i].val=(tree[i].val+k*(tree[i].r-tree[i].l+1))%p;
return;
}
pushdown(i);
int mid=(tree[i].l+tree[i].r)>>1;
if(mid>=l)
update2(i*2,l,r,k);
if(mid+1<=r)
update2(i*2+1,l,r,k);
tree[i].val=(tree[i*2].val+tree[i*2+1].val)%p;
return;
}
int main(){
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(m--){
int op,x,y,k;
cin>>op>>x>>y;
if(op==1){
cin>>k;
update1(1,x,y,k);
}
else if(op==2){
cin>>k;
update2(1,x,y,k);
}
else
cout<<sum(1,x,y)<<endl;
}
return 0;
}