#include<bits/stdc++.h>
#define int long long
using namespace std;
//int read()
//{
// int x=0;
// int f=1;
// char c=getchar();
// while(c<'0'||c>'9'){
// if(c=='-')
// f=-1;
// c=getchar();
// }
// while(c>='0'&&c<='9'){
// x=x*10+c-'0';
// c=getchar();
// }
// return x*f;
//}
const int N=1e5+6;
const int M=1e3+6;
const int mod=1e4+7;
int n,a[N],wz[N],add[N],mul[N],kc;
void lazy(int x)
{
for(int i=(x-1)*kc+1;i<=x*kc;i++){
a[i]=(a[i]*mul[x])%mod;
a[i]=(a[i]+add[x])%mod;
}
mul[x]=1;
add[x]=0;
return;
}
void add_(int l,int r,int z)
{
if(wz[l]==wz[r]){
lazy(wz[l]);
for(int i=l;i<=r;i++)
a[i]=(a[i]+z)%mod;
}
else{
lazy(wz[l]);
for(int i=l;i<=wz[l]*kc;i++)
a[i]=(a[i]+z)%mod;
for(int i=wz[l]+1;i<wz[r];i++)
add[i]=(add[i]+z)%mod;
lazy(wz[r]);
for(int i=(wz[r]-1)*kc+1;i<=r;i++)
a[i]=(a[i]+z)%mod;
}
return;
}
void Mul(int l,int r,int z)
{
if(wz[l]==wz[r]){
lazy(wz[l]);
for(int i=l;i<=r;i++)
a[i]=(a[i]*z)%mod;
}
else{
lazy(wz[l]);
for(int i=l;i<=wz[l]*kc;i++)
a[i]=(a[i]*z)%mod;
for(int i=wz[l]+1;i<wz[r];i++){
add[i]=(add[i]*z)%mod;
mul[i]=(mul[i]*z)%mod;
}
lazy(wz[r]);
for(int i=(wz[r]-1)*kc+1;i<=r;i++)
a[i]=(a[i]*z)%mod;
}
return;
}
signed main()
{
// n=read();
scanf("%lld",&n);
kc=sqrt(n);
for(int i=1;i<=n;i++){
// a[i]=read();
scanf("%lld",&a[i]);
a[i]%=mod;
wz[i]=(i-1)/kc+1;
mul[i]=1;
}
for(int fzh=1;fzh<=n;fzh++){
int opt,l,r,z;
// opt=read();
// l=read();
// r=read();
// z=read();
scanf("%lld%lld%lld%lld",&opt,&l,&r,&z);
if(!opt)
add_(l,r,z);
else if(opt==1)
Mul(l,r,z);
else if(opt==2)
printf("%lld\n",(((a[r]*mul[wz[r]]))%mod+add[wz[r]])%mod);
}
return 0;
}
求调,为什么只有30分qwq。
帮帮我吧!谢谢。
题目:LibreOJ #6283. 数列分块入门 7