@[Vsinger_洛天依](/user/1000298) ,你lazyx函数中lazyadd也要乘
by 赛克尔だよ @ 2023-10-16 16:49:29
@[赛克尔だよ](/user/376348) 谢谢谢谢
by Vsinger_洛天依 @ 2023-10-16 16:50:04
我去试试
by Vsinger_洛天依 @ 2023-10-16 16:51:45
Orz好像还是WA了
```cpp
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
long long s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0';ch=getchar();}
return s*w;
}
template <typename T>
void write(T x) {
if(x<0){x=-x;putchar('-');}
if(x<=9){putchar(x+'0');return;}
write(x/10);putchar(x%10+'0');
}
struct node{
long long l,r;
long long lazyadd,dat,lazyx;
}t[0x66ccff];
long long a[0x66ccff],m;
void build(int q,int l,int r){
t[q].l=l;
t[q].r=r;
if(l==r){
t[q].dat=a[l];
return;
}
long long mid=(l+r)/2;
build(q*2,l,mid);
build(q*2+1,mid+1,r);
t[q].dat=(t[q*2].dat+t[q*2+1].dat)%m;
}
void lazyadd(int q){
t[q*2].lazyadd+=t[q].lazyadd%m;
t[q*2].dat+=((t[q*2].r-t[q*2].l+1)*t[q].lazyadd)%m;
t[q*2+1].lazyadd+=t[q].lazyadd%m;
t[q*2+1].dat+=((t[q*2+1].r-t[q*2+1].l+1)*t[q].lazyadd)%m;
t[q].lazyadd=0;
}
void lazyx(int q){
t[q].lazyadd*=t[q].lazyx%m;
t[q*2].lazyadd*=t[q].lazyx%m;
t[q*2+1].lazyadd*=t[q].lazyx%m;
t[q*2].lazyx*=t[q].lazyx%m;
t[q*2].dat*=((t[q*2].r-t[2*q].l+1)*t[q].lazyx)%m;
t[q*2+1].lazyx*=t[q].lazyx%m;
t[q*2+1].dat*=((t[q*2+1].r-t[q*2+1].l+1)*t[q].lazyx)%m;
t[q].lazyx=0;
}
void change1(int q,int l,int r,int v){
if(t[q].l>r||t[q].r<l)
return;
if(t[q].l>=l && t[q].r<=r){
(t[q].lazyadd+=v)%=m;
(t[q].dat+=(t[q].r-t[q].l+1)*v%m)%=m;
return;
}
if(t[q].lazyadd>0)
lazyadd(q);
change1(q*2,l,r,v);
change1(q*2+1,l,r,v);
(t[q].dat=(t[q*2].dat+t[q*2+1].dat))%=m;
}
void change2(int q,int l,int r,int v){
if(t[q].l>r||t[q].r<l)
return;
if(t[q].l>=l&&t[q].r<=r){
(t[q].lazyx*=v)%m;
(t[q].dat*=(t[q].r-t[q].l+1)*v%m)%=m;
return;
}
if(t[q].lazyx>0)
lazyx(q);
change2(q*2,l,r,v);
change2(q*2+1,l,r,v);
t[q].dat=t[q*2].dat+t[q*2+1].dat;
}
long long ask(int q,int l,int r){
if(t[q].l>r || t[q].r<l)
return 0;
if(t[q].l>=l && t[q].r<=r)
return t[q].dat;
if(t[q].lazyx>0)
lazyx(q);
if(t[q].lazyadd>0)
lazyadd(q);
return (ask(q*2,l,r)+ask(q*2+1,l,r))%m;
}
int main(){
int n=read(),q=read();
m=read();
for(int i=1;i<=n;i++)
a[i]=read();
build(1,1,n);
for(int i=1;i<=q;i++) {
int ans=read();
if(ans==1){
int x=read(),y=read(),k=read();
change2(1,x,y,k);
}
else if(ans==2){
int x=read(),y=read(),k=read();
change1(1,x,y,k);
}
else if(ans==3){
int x=read(),y=read();
cout<<ask(1,x,y)<<"\n";
}
}
}
by Vsinger_洛天依 @ 2023-10-16 16:55:02
@[Vsinger_洛天依](/user/1000298) 等我一下,我再调
by 赛克尔だよ @ 2023-10-16 17:07:24
@[赛克尔だよ](/user/376348) 谢谢您
by Vsinger_洛天依 @ 2023-10-16 17:09:59
懒标记可能为负吧?我不知道。
取模是不是少了?我不知道。
by Sonnety @ 2023-10-16 17:10:08
不会不会不会不会
by Hanzelic @ 2023-10-16 17:11:18
@[Sonnety](/user/892222) 问题不止这一点
by 赛克尔だよ @ 2023-10-16 17:12:33
@[Sonnety](/user/892222) Orz谢谢您我去看看
by Vsinger_洛天依 @ 2023-10-16 17:12:40