请忽略奇怪的变量名
#include <bits/stdc++.h>
using namespace std;
#define AK_IOI 1010000
typedef long long ll;
ll c,m,h;
ll Naoh[AK_IOI];
ll zzp[AK_IOI];
ll chen_zhe[AK_IOI];//维护加法
ll xmyzwls[AK_IOI];//维护乘法
void pushup(ll rt)
{
zzp[rt]=zzp[rt<<1]+zzp[rt<<1|1];
}
void pushdown(ll l,ll r,ll rt,ll h){
ll mid=(l+r)>>1;
zzp[rt<<1]=(ll)(zzp[rt<<1]*xmyzwls[rt]+(chen_zhe[rt]*(mid-l+1))%h)%h;
zzp[rt<<1|1]=(ll)(zzp[rt<<1|1]*xmyzwls[rt]+(chen_zhe[rt]*(r-mid))%h)%h;
xmyzwls[rt<<1]=(ll)(xmyzwls[rt<<1]*xmyzwls[rt])%h;
xmyzwls[rt<<1|1]=(ll)(xmyzwls[rt<<1|1]*xmyzwls[rt])%h;
chen_zhe[rt<<1]=(ll)(chen_zhe[rt<<1]*xmyzwls[rt]+chen_zhe[rt])%h;
chen_zhe[rt<<1|1]=(ll)(chen_zhe[rt<<1|1]*xmyzwls[rt]+chen_zhe[rt])%h;
xmyzwls[rt]=1;chen_zhe[rt]=0;
}
/*
t[p*2].sum=(ll)(t[p].mu*t[p*2].sum+((t[p*2].r-t[p*2].l+1)*t[p].add)%mod)%mod;
t[p*2+1].sum=(ll)(t[p].mu*t[p*2+1].sum+(t[p].add*(t[p*2+1].r-t[p*2+1].l+1))%mod)%mod;//add已经乘过mu啦
t[p*2].mu=(ll)(t[p*2].mu*t[p].mu)%mod;
t[p*2+1].mu=(ll)(t[p*2+1].mu*t[p].mu)%mod;
t[p*2].add=(ll)(t[p*2].add*t[p].mu+t[p].add)%mod;
t[p*2+1].add=(ll)(t[p*2+1].add*t[p].mu+t[p].add)%mod;
t[p].mu=1,t[p].add=0;
*/
void build(ll l,ll r,ll rt){
if (l==r){
chen_zhe[rt]=0;
xmyzwls[rt]=1;
zzp[rt]=Naoh[l];
return ;
}
ll mid=(l+r)>>1;
build(l,mid,rt*2);
build(mid+1,r,rt*2+1);
pushup(rt);
}
void mul(ll x,ll y,ll l,ll r,ll p,ll rt,ll h){
if (l>y||r<x) return ;
if (x<=l&&r<=y){
chen_zhe[rt]=(chen_zhe[rt]*p)%h;
xmyzwls[rt]=(xmyzwls[rt]*p)%h;
zzp[rt]=(zzp[rt]*p)%h;
return ;
}
pushdown(l,r,rt,h);
ll mid=(l+r)>>1;
mul(x,y,l,mid,p,rt*2,h);
mul(x,y,mid+1,r,p,rt*2+1,h);
pushup(rt);
}
void add(ll x,ll y,ll l,ll r,ll p,ll rt,ll h){
if (l>y||r<x) return ;
if (x<=l&&r<=y){
chen_zhe[rt]=(chen_zhe[rt]+p)%h;
zzp[rt]=(zzp[rt]+(r-l+1)*p);
return ;
}
pushdown(l,r,rt,h);
ll mid=(l+r)>>1;
add(x,y,l,mid,p,rt*2,h);
add(x,y,mid+1,r,p,rt*2+1,h);
pushup(rt);
}
ll que(ll x,ll y,ll l,ll r,ll rt,ll h){
if (l>=x&&r<=y){
return zzp[rt];
}
if (x>r||y<l) return 0;
pushdown(l,r,rt,h);
ll mid=(l+r)>>1;
return (que(x,y,l,mid,rt*2,h)+que(x,y,mid+1,r,rt*2+1,h))%h;
}
int main()
{
cin>>c>>m>>h;
for (ll i=1;i<=c;i++) cin>>Naoh[i];
build(1,c,1);
for (ll j=1;j<=m;j++){
ll n,o,i,p;
cin>>n;
if (n==1){
cin>>o>>i>>p;
mul(o,i,1,c,p,1,h);
}
if (n==2){
cin>>o>>i>>p;
add(o,i,1,c,p,1,h);
}
if (n==3){
cin>>o>>i;
cout<<que(o,i,1,c,1,h)%h<<endl;
}
}
return 0;
}
请忽略奇怪的变量名
样例没过,全部WA掉。
求查错qwq