社区讨论
全WA求调玄两关
P3373【模板】线段树 2参与者 3已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lymrxd8t
- 此快照首次捕获于
- 2024/07/15 17:20 2 年前
- 此快照最后确认于
- 2024/07/15 18:31 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int a[2313222],w[12323232];
int mx[1232132];
int laz[2323213];
int che[2132132];
int d;
void build(int id,int l,int r){
che[id]=1;
if(l==r){
w[id]=a[l];
return;
}
int mid=l+r>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
w[id]=w[id<<1]+w[id<<1|1];
return ;
}
void push_down(int id,int l,int r){
int mid=l+r>>1;
laz[id<<1]+=laz[id];
laz[id<<1|1]+=laz[id];
che[id<<1]*=che[id];
che[id<<1|1]*=che[id];
w[id<<1|1]=che[id]*w[id<<1|1]+(r-mid)*laz[id];
w[id<<1]=che[id]*w[id<<1]+(mid-l+1)*laz[id];
w[id<<1]=((w[id<<1]%d)+d)%d;
w[id<<1|1]=((w[id<<1|1]%d)+d)%d;
laz[id<<1|1]=((laz[id<<1|1]%d)+d)%d;
laz[id<<1]=((laz[id<<1]%d)+d)%d;
che[id<<1]=((laz[id<<1]%d)+d)%d;
che[id<<1|1]=((laz[id<<1|1]%d)+d)%d;
che[id]=1;
laz[id]=0;
}
int find(int id,int l,int r,int L,int R){
if(L==l&&R==r){
return w[id];
}
push_down(id,l,r);
int mid=l+r>>1;
if(R<=mid) return find(id<<1,l,mid,L,R);
else if(L>mid) return find(id<<1|1,mid+1,r,L,R);
else return ((find(id<<1,l,mid,L,mid)%d)+(find(id<<1|1,mid+1,r,mid+1,R)%d)+d)%d;
}
void update(int id,int l,int r,int L,int R,int c,int op){
if(l==L&&R==r){
if(op==2){
w[id]+=(r-l+1)*c;
laz[id]+=c;
w[id]=((w[id]%d)+d)%d;
laz[id]=((laz[id]%d)+d)%d;
return ;
}
else{
w[id]*=c;
che[id]*=c;
w[id]=((w[id]%d)+d)%d;
che[id]=((che[id]%d)+d)%d;
return ;
}
}
int mid=l+r>>1;
push_down(id,l,r);
if(R<=mid) update(id<<1,l,mid,L,R,c,op);
else if(L>mid)update(id<<1|1,mid+1,r,L,R,c,op);
else update(id<<1,l,mid,L,mid,c,op),update(id<<1|1,mid+1,r,mid+1,R,c,op);
w[id]=w[id<<1]+w[id<<1|1];
w[id]=((w[id]%d)+d)%d;
return ;
}
main(){
cin>>n>>m>>d;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int l,r,x;
cin>>l>>r>>x;
update(1,1,n,l,r,x,op);
}
else if(op==2){
int l,r,x;
cin>>l>>r>>x;
update(1,1,n,l,r,x,op);
}
else{
int l,r;
cin>>l>>r;
cout<<(((find(1,1,n,l,r)%d)+d)%d)<<endl;
}
}
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...