MnZn刚学线段树-114514s求助,(过样例全哇
查看原帖
MnZn刚学线段树-114514s求助,(过样例全哇
229008
yshpdyt楼主2023/8/3 20:12
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,mod,f[414514],lzy[414514],g[414514],a[414514],lzt[414514];
void build (ll p,ll l,ll r){
    lzt[p]=1;
    lzy[p]=0;
    if(l==r){
        f[p]=a[l]%mod;
        return ;
    }
    ll mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    f[p]=(f[p<<1]+f[p<<1|1])%mod;
}
void lt(ll p,ll x,ll y,ll len){
    lzy[p]+=x;
    lzy[p]%=mod;
    lzt[p]*=y;
    lzt[p]%=mod;
    f[p]=(f[p]*y+x*len)%mod;
}
void pushdown(ll p,ll l,ll r){
    ll mid=(l+r)>>1;
    lt(p<<1,lzy[p],lzt[p],mid-l+1);
    lt(p<<1|1,lzy[p],lzt[p],r-mid);
    lzy[p]=0;
    lzt[p]=1;
}
void update1(ll p,ll l,ll r,ll le,ll ri,ll x){
    if(ri>=r&&le<=l){
        lt(p,x,1,r-l+1);
        return ;
    }
    pushdown(p,l,r);
    ll mid=(l+r)>>1;
    if(mid>=le)update1(p<<1,l,mid,le,ri,x);
    if(mid<ri)update1(p<<1|1,mid+1,r,le,ri,x);
    f[p]=(f[p<<1]+f[p<<1|1])%mod;
}
void update2(ll p,ll l,ll r,ll le,ll ri,ll x){
    if(ri>=r&&le<=l){
        lt(p,0,x,r-l+1);
        return ;
    }
    pushdown(p,l,r);
    ll mid=(l+r)>>1;
    if(mid>=le)update2(p<<1,l,mid,le,ri,x);
    if(mid<ri)update2(p<<1|1,mid+1,r,le,ri,x);
    f[p]=(f[p<<1]+f[p<<1|1])%mod;
}
ll ask(ll p,ll l,ll r,ll le,ll ri){
    if(ri>=r&&le<=l)return f[p];
    pushdown(p,l,r);
    ll mid=(l+r)>>1;
    ll ans=0;
    if(mid>=le)ans+=ask(p<<1,l,mid,le,ri)%mod;
    if(mid<ri)ans+=ask(p<<1|1,mid+1,r,le,ri)%mod;
    return ans;
}
int main(){
    cin>>n>>m>>mod;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    while(m--){
        ll c,l,r,x;
        cin>>c>>l>>r;
        if(c==2){
            cin>>x;
            update1(1,1,n,l,r,x);
        }
        if(c==1){
            cin>>x;
            update2(1,1,n,l,r,x);
        }
        if(c==3){
            cout<<ask(1,1,n,l,r)%mod<<endl;
        }
    }
    return 0;
}
2023/8/3 20:12
加载中...