1 条题解

  • 0
    @ 2023-10-27 20:39:20
    #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
    上传者