1 条题解
-
0
#include<bits/stdc++.h> #define ll long long using namespace std; const ll mod=10007; ll a[100005]; ll pos[100005]; ll add[505]; ll mul[505]; ll n; ll block; void update(int p) { // 更新第 p 个分块 for (int i = (p-1)*block+1; i <= min(n, p*block); i++) a[i] = (a[i] * mul[p] + add[p]) % mod; mul[p] = 1; add[p] = 0; } void adddate(ll l,ll r,ll x) { if(pos[l]==pos[r]) { // for(int i=(pos[l]-1)*block+1;i<=min(n, pos[l]*block);i++) // a[i]=a[i]*mul[pos[l]]%mod+add[pos[l]]%mod,a[i]%=mod; // mul[pos[l]]=1,add[pos[l]]=0; update(pos[l]); for(int i=l;i<=r;i++) a[i]+=x,a[i]%=mod; return; } // for(int i=(pos[l]-1)*block+1;i<=pos[l]*block;i++) // a[i]=a[i]*mul[pos[l]]%mod+add[pos[l]]%mod,a[i]%=mod; // mul[pos[l]]=1,add[pos[l]]=0; update(pos[l]); for(int i=l;i<=pos[l]*block;i++) a[i]+=x,a[i]%=mod; for(int i=pos[l]+1;i<pos[r];i++) add[i]+=x,add[i]%=mod; // for(int i=(pos[r]-1)*block+1;i<=min(pos[r]*block,n);i++) // a[i]=a[i]*mul[pos[r]]%mod+add[pos[r]]%mod,a[i]%=mod; // mul[pos[r]]=1,add[pos[r]]=0; update(pos[r]); for(int i=(pos[r]-1)*block+1;i<=r;i++) a[i]+=x,a[i]%=mod; } void muldate(ll l,ll r,ll x) { if(pos[l]==pos[r]) { for(int i=(pos[l]-1)*block+1;i<=min(n, pos[l]*block);i++) a[i]=a[i]*mul[pos[l]]%mod+add[pos[l]]%mod,a[i]%=mod; mul[pos[l]]=1,add[pos[l]]=0; for(int i=l;i<=r;i++) a[i]*=x,a[i]%=mod; return; } // for(int i=(pos[l]-1)*block+1;i<=min(n, pos[l]*block);i++) // a[i]=a[i]*mul[pos[l]]%mod+add[pos[l]]%mod,a[i]%=mod; // mul[pos[l]]=1,add[pos[l]]=0; update(pos[l]); for(int i=l;i<=pos[l]*block;i++) a[i]*=x,a[i]%=mod; for(int i=pos[l]+1;i<pos[r];i++) mul[i]*=x,mul[i]%=mod,add[i]*=x,add[i]%=mod; // for(int i=(pos[r]-1)*block+1;i<=pos[r]*block;i++) // a[i]=a[i]*mul[pos[r]]%mod+add[pos[r]]%mod,a[i]%=mod; // mul[pos[r]]=1,add[pos[r]]=0; update(pos[r]); for(int i=(pos[r]-1)*block+1;i<=r;i++) a[i]*=x,a[i]%=mod; } int main() { scanf("%lld",&n); block=sqrt(n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]),pos[i]=(i-1)/block+1; for(int i=1;i<=pos[n];i++) mul[i]=1,add[i]=0; ll T; scanf("%lld",&T); while(T--) { ll op; scanf("%lld",&op); if(op==1) { ll l,r,x; scanf("%lld%lld%lld",&l,&r,&x); adddate(l,r,x); } if(op==2) { ll l,r,x; scanf("%lld%lld%lld",&l,&r,&x); muldate(l,r,x); } if(op==3) { ll p; scanf("%lld",&p); printf("%lld\n",(a[p]*mul[pos[p]]%mod+add[pos[p]]%mod)%mod); } } return 0; }
- 1
信息
- ID
- 6
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 15
- 已通过
- 4
- 上传者