全WA
我要吐了,调了两个小时和题解对比一直没发现错
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,mod;
int a[N];
struct tree{
int sum,mul,add;
int l,r;
}s[N*4];
inline int lc(int x){
return x<<1;
}
inline int rc(int x){
return x<<1|1;
}
void pushup(int x){
s[x].sum=(s[lc(x)].sum+s[rc(x)].sum)%mod;
}
void buildtree(int x,int l,int r){
s[x].l=l;
s[x].r=r;
s[x].mul=1;
if(l==r){
s[x].sum=a[l]%mod;
return ;
}
int mid=(l+r)/2;
buildtree(lc(x),l,mid);
buildtree(rc(x),mid+1,r);
pushup(x);
}
void pushdown(int x){
s[lc(x)].sum=(s[lc(x)].sum*s[x].mul+s[x].add*(s[lc(x)].r-s[lc(x)].l+1))%mod;
s[rc(x)].sum=(s[rc(x)].sum*s[x].mul+s[x].add*(s[rc(x)].r-s[rc(x)].l+1))%mod;
s[lc(x)].mul=(s[lc(x)].mul*s[x].mul)%mod;
s[rc(x)].mul=(s[rc(x)].mul*s[x].mul)%mod;
s[lc(x)].add=(s[lc(x)].add*s[x].mul+s[x].add)%mod;
s[rc(x)].add=(s[rc(x)].add*s[x].mul+s[x].add)%mod;
s[x].add=0;
s[x].mul=1;
}
void cadd(int x,int l1,int r1,int d){
if(l1<=s[x].l&&s[x].r<=r1){
s[x].add=(s[x].add+d)%mod;
s[x].mul=(s[x].sum+d*(s[x].r-s[x].l+1))%mod;
return ;
}
pushdown(x);
int mid=(s[x].l+s[x].r)/2;
if(l1<=mid)cadd(lc(x),l1,r1,d);
if(mid<r1)cadd(rc(x),l1,r1,d);
pushup(x);
}
void cmul(int x,int l1,int r1,int d){
if(l1<=s[x].l&&s[x].r<=r1){
s[x].add=(s[x].add+d)%mod;
s[x].mul=(s[x].mul+d)%mod;
s[x].sum=(s[x].sum+d)%mod;
return ;
}
pushdown(x);
int mid=(s[x].l+s[x].r)/2;
if(l1<=mid)cmul(lc(x),l1,r1,d);
if(mid<r1)cmul(rc(x),l1,r1,d);
pushup(x);
}
int query(int x,int l1,int r1){
if(l1<=s[x].l&&s[x].r<=r1) return s[x].sum;
pushdown(x);
int mid=(s[x].l+s[x].r)/2;
int res=0;
if(l1<=mid)res=(res+query(lc(x),l1,r1))%mod;
if(mid<r1)res=(res+query(rc(x),l1,r1))%mod;
return res;
}
signed main(){
int op,x,y,k;
scanf("%lld%lld%lld",&n,&m,&mod);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
buildtree(1,1,n);
while(m--){
scanf("%lld",&op);
if(op==1){
scanf("%lld%lld%lld",&x,&y,&k);
cadd(1,x,y,k);
}else if(op==2){
scanf("%lld%lld%lld",&x,&y,&k);
cmul(1,x,y,k);
}else{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(1,x,y));
}
}
return 0;
}