可能是被出题人对着卡了。。。本地随机数据跑得挺快的,学下线段树吧qwq
by Endline @ 2024-01-21 14:05:26
@[Endline](/user/401052) 谢了
by Bxiay @ 2024-01-21 14:07:41
@[Bxiay](/user/1116724) mod 改成常数跑得快多了
```cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=320;
const int mod=571373;
int n,x,y,k,m,_,t,opt,p,q;
int a[maxn*maxn],l[maxn],r[maxn],cheng[maxn],jia[maxn],pos[maxn*maxn],sum[maxn];
inline int read(){
int s = 0,f = 1;
char ch = getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f = -1;
ch = getchar();
}
while(ch>='0'&&ch<='9'){
s = (s<<1)+(s<<3)+(ch^48);
ch = getchar();
}
return s*f;
}
void updatecheng(int x,int y,int k){
p=pos[x]; q=pos[y];
if(p==q){
sum[p]=0;
for(int i=l[p];i<=r[p];i++){
a[i]=(a[i]*cheng[p]+jia[p])%mod;
if(i>=x && i<=y) a[i]=a[i]*k%mod;
sum[p]=(sum[p]+a[i])%mod;
}
cheng[p]=1; jia[p]=0;
return;
}
for(int i=p+1;i<=q-1;i++){
sum[i]=sum[i]*k%mod;
cheng[i]=cheng[i]*k%mod; jia[i]=jia[i]*k%mod;
}
sum[p]=0;
for(int i=l[p];i<=r[p];i++){
a[i]=(a[i]*cheng[p]+jia[p])%mod;
if(i>=x) a[i]=a[i]*k%mod;
sum[p]=(sum[p]+a[i])%mod;
}
cheng[p]=1; jia[p]=0;
sum[q]=0;
for(int i=l[q];i<=r[q];i++){
a[i]=(a[i]*cheng[q]+jia[q])%mod;
if(i<=y) a[i]=a[i]*k%mod;
sum[q]=(sum[q]+a[i])%mod;
}
cheng[q]=1; jia[q]=0;
}
void updatejia(int x,int y,int k){
p=pos[x]; q=pos[y];
if(p==q){
sum[p]=0;
for(int i=l[p];i<=r[p];i++){
a[i]=(a[i]*cheng[p]+jia[p])%mod;
if(i>=x && i<=y) a[i]=(a[i]+k)%mod;
sum[p]=(sum[p]+a[i])%mod;
}
cheng[p]=1; jia[p]=0;
return;
}
for(int i=p+1;i<=q-1;i++){
sum[i]=(sum[i]+(r[i]-l[i]+1)*k)%mod; jia[i]=(jia[i]+k)%mod;
}
sum[p]=0;
for(int i=l[p];i<=r[p];i++){
a[i]=(a[i]*cheng[p]+jia[p])%mod;
if(i>=x) a[i]=(a[i]+k)%mod;
sum[p]=(sum[p]+a[i])%mod;
}
cheng[p]=1; jia[p]=0;
sum[q]=0;
for(int i=l[q];i<=r[q];i++){
a[i]=(a[i]*cheng[q]+jia[q])%mod;
if(i<=y) a[i]=(a[i]+k)%mod;
sum[q]=(sum[q]+a[i])%mod;
}
cheng[q]=1; jia[q]=0;
}
int query(int x,int y){
int ans=0;
p=pos[x]; q=pos[y];
if(p==q){
for(int i=x;i<=y;i++) ans=(ans+a[i]*cheng[p]+jia[p])%mod;
return ans;
}
for(int i=p+1;i<=q-1;i++) ans=(ans+sum[i])%mod;
for(int i=x;i<=r[p];i++) ans=(ans+a[i]*cheng[p]+jia[p])%mod;
for(int i=l[q];i<=y;i++) ans=(ans+a[i]*cheng[q]+jia[q])%mod;
return ans;
}
signed main(){
n=read();
m=read();
_=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
t=sqrt(n);
for(int i=1;i<=t;i++){
l[i]=t*(i-1)+1; r[i]=t*i;
}
if(r[t]<n){
t++; l[t]=r[t-1]+1; r[t]=n;
}
for(int i=1;i<=t;i++){
for(int j=l[i];j<=r[i];j++){
pos[j]=i; sum[i]=(sum[i]+a[j])%mod;
}
}
for(int i=1;i<=t;i++){
cheng[i]=1;
}
for(int o=1;o<=m;o++){
opt=read();
if(opt==1){
x=read(); y=read(); k=read();
updatecheng(x,y,k);
}
if(opt==2){
x=read(); y=read(); k=read();
updatejia(x,y,k);
}
if(opt==3){
x=read(); y=read();
printf("%lld\n",query(x,y));
}
}
return 0;
}
```
by asas111 @ 2024-01-28 21:32:47
@[asas111](/user/661096) 感谢,我删去了几个取模后就通过了,而且还用线段树做了一次
by Bxiay @ 2024-01-29 14:34:57