站外题求助
  • 板块学术版
  • 楼主114514xxx
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/16 09:47
  • 上次更新2024/8/16 11:19:26
查看原帖
站外题求助
749175
114514xxx楼主2024/8/16 09:47

地址

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+25;
int n,a[N],L[N],R[N],pos[N],sum[N];
int add[N],mul[N];
int MOD=10007;
void reset(int x){
    for(int i=L[x];i<=R[x];i++)
        a[i]=(a[i]*mul[x]+add[x])%MOD;
    mul[x]=1,add[x]=0;
}
void modify(int f,int l,int r,int c){
    int p=pos[l],q=pos[r];
    reset(p);
    if(p==q){
        for(int i=l;i<=r;i++){
            if(!f)a[i]=(a[i]+c)%MOD;
            else a[i]=(a[i]*c)%MOD;
            a[i]%=MOD;
        }
    }
    else{
        reset(q);
        for(int i=l;i<=R[p];i++){
            if(!f)a[i]=(a[i]+c)%MOD;
            else a[i]=(a[i]*c)%MOD;
            a[i]%=MOD;
        }
        for(int i=L[q];i<=r;i++){
            if(!f)a[i]=(a[i]+c)%MOD;
            else a[i]=(a[i]*c)%MOD;
            a[i]%=MOD;
        }
        for(int i=p+1;i<=q-1;i++){
            if(!f)add[i]=(add[i]+c)%MOD;
            else{
                add[i]=(add[i]*c)%MOD;
                mul[i]=(mul[i]*c)%MOD;
            }
        }
    }
}
int query(int m){
    int x=pos[m];
    return ((a[m]*mul[x]%MOD)+add[x])%MOD;
}
signed main(){
    std::ios::sync_with_stdio(0);
    for(int i=1;i<=200000;i++)
        mul[i]=1;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int t=sqrt(n);
    for(int i=1;i<=t;i++)
        L[i]=(i-1)*t,R[i]=i*t;
    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,add[i]=0;
    int opt,l,r,c;
    for(int i=1;i<=n;i++){
        cin>>opt>>l>>r>>c;
        if(opt==2)cout<<query(r)%MOD<<endl;
        else modify(opt,l,r,c);
    }
}

2024/8/16 09:47
加载中...