@[sbno333](/user/416975)
- `if(l==f[t].l&&r==f[t].r)` 应该是 `if(l<=f[t].l&&r>=f[t].r)`。
- 加 `tag` 和更新区间的顺序要搞清楚。
- 你的码风太恐怖了,看不懂。
by One_JuRuo @ 2023-11-23 16:32:15
@[One_JuRuo](/user/86507) 第一个好像没必要
第二个能具体举出么?好像没问题啊啊啊。
第三个就是复制粘贴了一些模,所以长了点。
by sbno333 @ 2023-11-23 16:37:39
@[sbno333](/user/416975) 啊?我们学的线段树不是一个?你修改/查询的区间完全覆盖当前节点的区间就修改,你这个不是要当前节点的区间和修改/查询的区间完全一样才覆盖吗?
为啥不把 `pushup`、`pushdown`、`addtag` 写成函数啊,而且取模那些都可以写成一句,~~这么不想打括号吗~~
我实在看不懂,我就把我的 `addtag` 放上来吧:
```cpp
void addtag(int p,int add,int mul)
{
tree[p].sum=((long long)tree[p].sum*mul+(long long)(tree[p].r-tree[p].l+1)*add)%mod;
tree[p].mul=((long long)tree[p].mul*mul)%mod;
tree[p].add=((long long)tree[p].add*mul+add)%mod;
}
```
by One_JuRuo @ 2023-11-23 16:41:10
@[sbno333](/user/416975) 好像修改/查询确实不太一样。。。
by One_JuRuo @ 2023-11-23 16:43:30
感谢,已有思路并改,已关注大佬,您 S 吊打我 $95$ pts。
```cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,m;
int aa[10000009];
struct st{
int l,r;
int x;
int b1,b2;
}f[10000009];
void inite(int l,int r,int t){
f[t].x=aa[r]-aa[l-1];
f[t].l=l;
f[t].r=r;
f[t].b1=1;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
if(l==r){
return;
}
int mid;
mid=l+r;
mid/=2;
inite(l,mid,2*t);
inite(mid+1,r,2*t+1);
}
void qc(int t,int l,int r,int x){
if(l==f[t].l&&r==f[t].r){
f[t].b1*=x;
f[t].b2*=x;
f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1);//原来写作(r-l+1),下面同
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
return;
}
f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
int mid;
mid=f[t].l+f[t].r;
mid/=2;
if(r<=mid){
qc(2*t,l,r,x);
}else if(l>mid){
qc(2*t+1,l,r,x);
}else{
qc(2*t,l,mid,x);
qc(2*t+1,mid+1,r,x);
}
f[t].x=(f[2*t].x*f[2*t].b1+f[2*t].b2*(f[2*t].r-f[2*t].l+1))+(f[2*t+1].x*f[2*t+1].b1+f[2*t+1].b2*(f[2*t+1].r-f[2*t+1].l+1));
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
}
void qj(int t,int l,int r,int x){
if(l==f[t].l&&r==f[t].r){
f[t].b2+=x;
f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
return;
}
f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
int mid;
mid=f[t].l+f[t].r;
mid/=2;
if(r<=mid){
qj(2*t,l,r,x);
}else if(l>mid){
qj(2*t+1,l,r,x);
}else{
qj(2*t,l,mid,x);
qj(2*t+1,mid+1,r,x);
}
f[t].x=(f[2*t].x*f[2*t].b1+f[2*t].b2*(f[2*t].r-f[2*t].l+1))+(f[2*t+1].x*f[2*t+1].b1+f[2*t+1].b2*(f[2*t+1].r-f[2*t+1].l+1));
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
}
int jj(int t,int l,int r){
if(l==f[t].l&&r==f[t].r){
f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
return f[t].x;
}
f[t].x=f[t].x*f[t].b1+f[t].b2*(f[t].r-f[t].l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
int mid;
mid=f[t].l+f[t].r;
mid/=2;
if(r<=mid){
return jj(2*t,l,r);
}else if(l>mid){
return jj(2*t+1,l,r);
}else{
return jj(2*t,l,mid)+jj(2*t+1,mid+1,r);
}
}
signed main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
cin>>aa[i];
aa[i]+=aa[i-1];
}
inite(1,n,1);
for(int i=1;i<=q;i++){
int s;
cin>>s;
if(s==1){
int x,y,k;
cin>>x>>y>>k;
qc(1,x,y,k);
}else if(s==2){
int x,y,k;
cin>>x>>y>>k;
qj(1,x,y,k);
}else{
int x,y;
cin>>x>>y;
cout<<jj(1,x,y)%m<<endl;
}
/*for(int i=1;f[i].b1>0;i++){
cout<<i<<"-"<<f[i].l<<"~"<<f[i].r<<":"<<f[i].b1<<"*("<<f[i].x<<")+"<<f[i].b2<<endl;
}*/
}
return 0;
}
```
by sbno333 @ 2023-11-23 16:51:43