社区讨论
30ptsWA QAQ
P3373【模板】线段树 2参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo10ydg0
- 此快照首次捕获于
- 2023/10/22 13:24 2 年前
- 此快照最后确认于
- 2023/11/02 12:55 2 年前
CPP
#include<bits/stdc++.h>
#define itn int
#define int long long
#define Max(a,b) (a>b?a:b)
#define Min(a,b) (a<b?a:b)
using namespace std;
const int N=2e5+10;
const int m=571373;
int n,q,sn;
int block[N],sum[N],lazy[N],a[N];
int lazypp[N];
void upp(itn l,int r,int x){
for(itn i=(block[l]-1)*sn+1;i<=Min(block[l]*sn,n);i++){
a[i]=a[i]*lazypp[block[i]]%m + lazy[block[i]];
}
lazypp[block[l]]=1;
lazy[block[l]]=0;
for(int i=l;i<=Min(r,block[l]*sn);i++){
sum[block[i]]+=(a[i]*(x-1))%m;
a[i]*=x%m;
}if(block[l]==block[r]) return;
for(itn i=(block[r]-1)*sn+1;i<=Min(block[r]*sn,n);i++){
a[i]=a[i]*lazypp[block[i]]%m + lazy[block[i]];
}
lazypp[block[r]]=1;
lazy[block[r]]=0;
for(int i= ( (block[r]-1)*sn+1);i<=r;i++){
sum[block[i]]+=(a[i]*(x-1))%m;
a[i]*=x%m;
}
for(itn i=block[l]+1;i<=block[r]-1;i++){
lazy[i]*=x%m;
lazypp[i]*=x%m;
sum[i]*=x%m;
}
}
void add(itn l,int r,int x){
for(itn i=(block[l]-1)*sn+1;i<=Min(block[l]*sn,n);i++){
a[i]=a[i]*lazypp[block[i]]%m + lazy[block[i]]%m;
}
lazypp[block[l]]=1;
lazy[block[l]]=0;
for(int i=l;i<=Min(r,block[l]*sn);i++){
sum[block[i]]+=x%m;
sum[block[i]]%=m;
a[i]+=x%m;
}if(block[l]==block[r]) return ;
for(itn i=(block[r]-1)*sn+1;i<=Min(block[r]*sn,n);i++){
a[i]=a[i]*lazypp[block[i]]%m + lazy[block[i]]%m;
}
lazypp[block[r]]=1;
lazy[block[r]]=0;
for(int i= ( (block[r]-1)*sn+1);i<=r;i++){
sum[block[i]]+=x;
sum[block[i]]%=m;
a[i]+=x%m;
}
for(itn i=block[l]+1;i<=block[r]-1;i++){
lazy[i]+=x%m;
sum[i]+=sn*x%m;
}
}
int query(int l,int r){
int ans=0;
for(int i=l;i<=Min(r,block[l]*sn);i++){
ans+=a[i]*lazypp[block[i]]%m;
ans+=lazy[block[i]]%m;
ans%=m;
}if(block[l]==block[r]) return ans%m;
for(int i= ( (block[r]-1)*sn+1);i<=r;i++){
ans+=a[i]*lazypp[block[i]]%m;
ans+=lazy[block[i]]%m;
ans%=m;
}
for(itn i=block[l]+1;i<=block[r]-1;i++){
ans+=sum[i]%m;
ans%=m;
}
return ans%m;
}
signed main(){
int x;
cin>>n>>q>>x;
sn=sqrt(n);
for(int i=1;i<=n;i++){
block[i]=(i-1)/sn+1;
}
for(itn i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[block[i]]+=a[i]%m;
lazypp[block[i]] = 1;
}
int op,y,k;
for(itn i=1;i<=q;i++){
cin>>op>>x>>y;
if(op==1){
cin>>k;
upp(x,y,k);
}if(op==2){
cin>>k;
add(x,y,k);
}if(op==3){
printf("%lld\n",query(x,y));
}
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...