社区讨论
代码求调
学术版参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lqbxc5gu
- 此快照首次捕获于
- 2023/12/19 13:48 2 年前
- 此快照最后确认于
- 2023/12/19 17:58 2 年前
大佬求调
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+5;
int tr[N],tg1[N],n,m,p,tg2[N];
void pushup(int u){
tr[u]=(tr[u<<1]+tr[u<<1|1])%p;
}
void build(int u,int l,int r){
tg1[u]=1;
if(l==r){
cin>>tr[u];
return ;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void pushdown(int u,int l,int r){
int &x=tg1[u],&y=tg2[u];
if(x==1&&!y)return ;
tg1[u*2]=(tg1[u*2]*x)%p;
tg1[u*2+1]=(tg1[u*2+1]*x)%p;
tg2[u*2]=(tg2[u*2]*x+y)%p;
tg2[u*2+1]=(tg2[u*2+1]*x+y)%p;
int mid=(l+r)>>1;
tr[u*2]=(tr[u*2]*x+(mid-l+1)*y)%p;
tr[u*2+1]=(tr[u*2+1]*x+(r-mid)*y)%p;
x=1;
y=0;
}
void modify(int u,int l,int r,int a,int b,int x,int y){
if(a<=l&&b>=r){
tg1[u]=(tg1[u]*x)%p;
tg2[u]=(tg2[u]*x+y)%p;
tr[u]=(tr[u]*x+(r-l+1)*y)%p;
return ;
}
int mid=(l+r)>>1;
pushdown(u,l,r);
if(a<=mid)modify(u*2,l,mid,a,b,x,y);
if(b>mid)modify(u*2+1,mid+1,r,a,b,x,y);
pushup(u);
}
int query(int u,int r,int l,int a,int b){
if(a<=l&&r<=b)return tr[u];
pushdown(u,l,r);
int s=0,mid=(l+r)>>1;
if(a<=mid)s=query(u*2,l,mid,a,b);
if(b>mid)s+=query(u*2+1,mid+1,r,a,b);
return s%p;
}
signed main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m>>p;
build(1,1,n);
for(int w,a,b,c;m--;){
cin>>w>>a>>b;
if(w==1) cin>>c,modify(1,1,n,a,b,c,0);
else if(w==2)cin>>c,modify(1,1,n,a,b,1,c);
else cout<<query(1,1,n,a,b)<<endl;
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...