P3373 30pts求助
  • 板块学术版
  • 楼主I_AK_noip2024
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/10 16:16
  • 上次更新2024/11/10 16:21:16
查看原帖
P3373 30pts求助
1061587
I_AK_noip2024楼主2024/11/10 16:16
#include<bits/stdc++.h>
using namespace std;
#define mod 571373
#define ls(k) (k)<<1
#define rs(k) ((k)<<1)+1
#define int long long
int n,m,a[500009],x,y,z,op,sum[2000009],add[2000009],mul[2000009],mo;
void build(int k,int l,int r){
	  mul[k]=1;
    if(l==r){
        sum[k]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(ls(k),l,mid);
    build(rs(k),mid+1,r);
    sum[k]=(sum[ls(k)]+sum[rs(k)])%mod;
}
inline void ad(int k,int l,int r,int v){
    add[k]+=v;
    add[k]%=mod;
    sum[k]+=v*(r-l+1);
    sum[k]%=mod;
}
inline void ml(int k,int l,int r,int v){
    add[k]*=v;
    add[k]%=mod;
    mul[k]*=v;
    mul[k]%mod;
    sum[k]*=v;
    sum[k]%=mod;
}
void pushdown(int k,int l,int r,int mid){
    ml(ls(k),l,mid,mul[k]);
    ad(ls(k),l,mid,add[k]);
    ml(rs(k),mid+1,r,mul[k]);
    ad(rs(k),mid+1,r,add[k]);
    add[k]=0;
    mul[k]=1;
} 
void ADD(int k,int l,int r,int x,int y,int v){
    if(l>=x&&r<=y){
        ad(k,l,r,v);
        return;
    }
    int mid=(l+r)>>1;
    pushdown(k,l,r,mid);
    if(x<=mid){
        ADD(ls(k),l,mid,x,y,v);
    }
    if(mid<y){
        ADD(rs(k),mid+1,r,x,y,v);
    }
    sum[k]=(sum[ls(k)]+sum[rs(k)])%mod;
}
void MUL(int k,int l,int r,int x,int y,int v){
    if(l>=x&&r<=y){
        ml(k,l,r,v);
        return;
    }
    int mid=(l+r)>>1;
    pushdown(k,l,r,mid);
    if(x<=mid){
        MUL(ls(k),l,mid,x,y,v);
    }
    if(mid<y){
        MUL(rs(k),mid+1,r,x,y,v);
    }
    sum[k]=(sum[ls(k)]+sum[rs(k)])%mod;
}
int query(int k,int l,int r,int x,int y){
    if(l>=x&&r<=y){
        return sum[k];
    }
    int mid=(l+r)>>1,ans=0;
    pushdown(k,l,r,mid);
    if(x<=mid){
        ans=query(ls(k),l,mid,x,y);
        ans%=mod;
    }
    if(mid<y){
        ans+=query(rs(k),mid+1,r,x,y);
        ans%=mod;
    }
    return ans%mod;
}
signed main(){
    cin>>n>>m>>mo;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    while(m--){
        cin>>op>>x>>y;
        if(op==2){            
            cin>>z;
            ADD(1,1,n,x,y,z);
        }
        else if(op==1){
            cin>>z;
            MUL(1,1,n,x,y,z);                                 
        }
        else{
            cout<<query(1,1,n,x,y)<<'\n';
        }
    }
    return 0;
}
2024/11/10 16:16
加载中...