社区讨论
蒟蒻线段树求调
P3373【模板】线段树 2参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo2ateyx
- 此快照首次捕获于
- 2023/10/23 10:48 2 年前
- 此快照最后确认于
- 2023/11/03 10:59 2 年前
CPP
#include<bits/stdc++.h>
#define N 400005
#define M 100005
#define int long long
using namespace std;
int n,m,mod;int a[M],sum[N],lzy[N],mul[N];
inline void pushup(int p){
sum[p]=(sum[p<<1]+sum[p<<1|1])%mod;
}
inline void calc(int p,int l,int r,int k,int c){
lzy[p]=(lzy[p]*c+k)%mod;
mul[p]*=c%mod;
sum[p]=(sum[p]*c+(r-l+1)*k)%mod;
}
inline void pushdown(int p,int l,int r){
int mid=l+r>>1;
calc(p<<1,l,mid,lzy[p],mul[p]);
calc(p<<1|1,mid+1,r,lzy[p],mul[p]);
lzy[p]=0;mul[p]=1;
}
inline void build(int p,int l,int r){
mul[p]=1;
if(l==r){
sum[p]=a[l]%mod;
return ;
}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
inline void change(int p,int l,int r,int L,int R ,int c,int k){
if(L<=l&&R>=r){
sum[p]=(sum[p]*c+k*(r-l+1))%mod;
lzy[p]=(lzy[p]*c+k)%mod;
mul[p]=mul[p]*c%mod;
}
pushdown(p,l,r);
int mid=l+r>>1;
if(L<=mid)change(p<<1,l,mid,L,R,c,k);
if(R>mid)change(p<<1|1,mid+1,r,L,R,c,k);
pushup(p);
}
inline int get(int p,int l,int r,int L,int R){
if(L<=l&&R>=r){
return sum[p]%mod;
}
int mid=l+r>>1;int res=0;
if(L<=mid)res+=get(p<<1,l,mid,L,R)%mod;
if(R>mid)res+=get(p<<1|1,mid+1,r,L,R)%mod;
return res;
}
signed main(){
cin.tie(0)->sync_with_stdio(false);
cin>>n>>m>>mod;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
int op,x,y;
cin>>op>>x>>y;
if(op==1){
int k;cin>>k;
change(1,1,n,x,y,k,0);
}
if(op==2){
int k;cin>>k;
change(1,1,n,x,y,1,k);
}
else cout<<get(1,1,n,x,y)<<'\n';
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...