萌新刚学线段树,0pt 求调
查看原帖
萌新刚学线段树,0pt 求调
749665
huta0楼主2024/7/22 18:41
#include <iostream>
#include <vector>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ll long long
#define int long long
using namespace std;
using poly=vector<ll>;
namespace ai {
    constexpr int N = 1e5+5;
    int n,m,mod,a,b,c,d,e,aa[N];
    struct node { int l,r,sum,tag,mu=1; } tr[N<<2];
    #define lc(p) (p<<1)
    #define rc(p) (p<<1|1)
    #define ln(p) (tr[p].r-tr[p].l+1)
    void pushup(int x) { return void(tr[x].sum=tr[lc(x)].sum+tr[rc(x)].sum); }
    void pushdown(int x) {
        if(tr[x].mu!=1) {
            tr[lc(x)].sum=tr[lc(x)].sum*tr[x].mu;
            tr[rc(x)].sum=tr[rc(x)].sum*tr[x].mu;
            tr[lc(x)].tag*=tr[x].mu,tr[rc(x)].tag*=tr[x].mu;
            tr[lc(x)].mu*=tr[x].mu,tr[rc(x)].mu*=tr[x].mu;
            tr[lc(x)].mu%=mod,tr[rc(x)].mu%=mod,tr[lc(x)].tag%=mod,tr[rc(x)].tag%=mod,tr[lc(x)].sum%=mod,tr[rc(x)].sum%=mod;
            tr[x].mu=1;
        }
        if(tr[x].tag) {
            tr[lc(x)].sum+=tr[x].tag*ln(lc(x));
            tr[rc(x)].sum+=tr[x].tag*ln(rc(x));
            tr[lc(x)].tag+=tr[x].tag,tr[rc(x)].tag+=tr[x].tag;
            tr[lc(x)].mu%=mod,tr[rc(x)].mu%=mod,tr[lc(x)].tag%=mod,tr[rc(x)].tag%=mod,tr[lc(x)].sum%=mod,tr[rc(x)].sum%=mod;
            tr[x].tag=0;
        }
    }
    void build(int p,int l,int r) {
        tr[p]={l,r,aa[l],0,1};
        if(l==r) return;
        int mid=l+r>>1;
        build(lc(p),l,mid); build(rc(p),mid+1,r);
        pushup(p);
    }
    void add(int p,int l,int r,int v) {
        if(l<=tr[p].l&&tr[p].r<=r) {
            tr[p].sum+=ln(p)*v; tr[p].sum%=mod;
            tr[p].tag+=v; tr[p].tag%=mod;
            return;
        }
        pushdown(p);
        int mid=tr[p].l+tr[p].r>>1;
        if(l<=mid) add(lc(p),l,r,v);
        if(r>mid) add(rc(p),l,r,v);
        pushup(p);
    }
    void mul(int p,int l,int r,int v) {
        if(l<=tr[p].l&&tr[p].r<=r) {
            tr[p].sum*=v; tr[p].sum%=mod;
            tr[p].mu*=v; tr[p].mu%=mod;
            return;
        }
        pushdown(p);
        int mid=tr[p].l+tr[p].r>>1;
        if(l<=mid) mul(lc(p),l,r,v);
        if(r>mid) mul(rc(p),l,r,v);
        pushup(p);
    }
    int qry(int p,int l,int r) {
        if(l<=tr[p].l&&tr[p].r<=r) return tr[p].sum%mod;
        pushdown(p); int mid=tr[p].l+tr[p].r>>1,ans=0;
        if(l<=mid) ans+=qry(lc(p),l,r),ans%=mod;
        if(r>mid) ans+=qry(rc(p),l,r),ans%=mod;
        return ans%mod;
    }
}
using namespace ai;
ai_jiang {
    cin.tie(0); cout.tie(0);
    cin>>n>>m>>mod;
    rep(i,1,n) cin>>aa[i];
    build(1,1,n);
    rep(i,1,m) {
        cin>>a>>b>>c;
        if(a==1) {
            cin>>d;
            mul(1,b,c,d);
        } else if(a==2) {
            cin>>d;
            add(1,b,c,d);
        } else if(a==3) {
            cout<<(qry(1,b,c)%mod)<<'\n';
        }
    }
    return 0;
}
2024/7/22 18:41
加载中...