Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
44543 | xujindong | 数列操作5 | C++ | 通过 | 100 | 180 MS | 1840 KB | 1151 | 2022-02-09 10:05:10 |
#include<bits/stdc++.h> using namespace std; long long n,a[100005],pos[100005],mul[100005],sum[100005],block; void reset(int x) { long long p=pos[x]; for(int i=(p-1)*block+1; i<=min(p*block,n); i++)a[i]=(mul[p]*a[i]+sum[p])%10007; mul[p]=1,sum[p]=0; } void change(int l,int r,int c,int opt) { reset(l); for(int i=l; i<=min(pos[l]*block,(long long)r); i++) { if(opt==0)a[i]=(a[i]+c)%10007; else a[i]=(a[i]*c)%10007; } if(pos[l]!=pos[r]) { reset(r); for(int i=(pos[r]-1)*block+1; i<=r; i++) if(opt==0)a[i]=(a[i]+c)%10007; else a[i]=(a[i]*c)%10007; } for(int i=pos[l]+1; i<=pos[r]-1; i++) if(opt==0)sum[i]=(sum[i]+c)%10007; else sum[i]=(sum[i]*c)%10007,mul[i]=(mul[i]*c)%10007; } int main() { scanf("%d",&n); block=sqrt(n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); a[i]%=10007; pos[i]=(i-1)/block+1; mul[pos[i]]=1; } for(int i=1,opt,l,r,c; i<=n; i++) { scanf("%d%d%d%d",&opt,&l,&r,&c); if(opt==0||opt==1)change(l,r,c,opt); else printf("%lld\n",(a[r]*mul[pos[r]]+sum[pos[r]])%10007); } return 0; }